OpenGL ES2.0/3.0 glTexImage2D 函数详解

glTexImage2D


http://docs.gl/es2/glTexImage2D


glTexImage2D - 指定一个二维纹理图像

C规范

void glTexImage2D(

GLenum target


GLint level


GLint internalformat


GLsizei 宽度,


GLsizei 高度,


GLint 边框,


GLenum format


GLenum type


const GLvoid * data) ;

 

internalFormat:指定OpenGL是如何管理纹理单元中数据格式的,但是有很多解释说这个参数必须和后面的format参数一样,这样理解笔者认为有点不太合适!笔者认为应该理解为internalFormatformat必须一致。

internalforamt指的是纹理数据在OpenGL中是如何表示的,如GL_RGB就表示纹理的像素在OpenGL里面以红绿蓝三个分量表示,

format指的是载入纹理的格式,它告诉OpenGL外部数据是如何存储每个像素数据的。


参数

target

指定活动纹理单元的目标纹理。必须是GL_TEXTURE_2DGL_TEXTURE_CUBE_MAP_POSITIVE_XGL_TEXTURE_CUBE_MAP_NEGATIVE_XGL_TEXTURE_CUBE_MAP_POSITIVE_YGL_TEXTURE_CUBE_MAP_NEGATIVE_YGL_TEXTURE_CUBE_MAP_POSITIVE_Z,或GL_TEXTURE_CUBE_MAP_NEGATIVE_Z

level

指定详细程度编号。级别0是基本图像级别。级别n是第n个缩略图缩小图像。

internalformat

指定纹理的内部格式。必须是下列符号常量之一:GL_ALPHAGL_LUMINANCEGL_LUMINANCE_ALPHAGL_RGBGL_RGBA

width

指定纹理图像的宽度。所有实现都支持宽度至少为64 texels2D纹理图像和宽度至少为16 texels的立方体贴图纹理图像。

height

指定纹理图像的高度所有实现都支持至少64像素高的2D纹理图像和至少16像素高的立方体贴图纹理图像。

border

指定边框的宽度。必须为0

format

指定纹理数据的格式。必须匹配internalformat。下面的符号值被接受:GL_ALPHAGL_RGBGL_RGBAGL_LUMINANCE,和GL_LUMINANCE_ALPHA

type

指定纹理数据的数据类型。下面的符号值被接受:GL_UNSIGNED_BYTEGL_UNSIGNED_SHORT_5_6_5GL_UNSIGNED_SHORT_4_4_4_4,和GL_UNSIGNED_SHORT_5_5_5_1

data

指定一个指向内存中图像数据的指针。

描述

纹理将指定纹理图像的一部分映射到纹理化为活动的每个图形基元上。当前片段着色器或顶点着色器使用内置纹理查找函数时,纹理处于活动状态。

要定义纹理图像,请调用glTexImage2D。参数描述纹理图像的参数,如高度,宽度,细节层次数(参见glTexParameter)和格式。最后三个参数描述了图像在内存中的表示方式。

数据从data一系列无符号字节或短路中读取,具体取决于type。当typeGL_UNSIGNED_BYTE,每个字节被解释为一个颜色分量。当type是中的一个GL_UNSIGNED_SHORT_5_6_5GL_UNSIGNED_SHORT_4_4_4_4GL_UNSIGNED_SHORT_5_5_5_1,各无符号短值被解释为包含所有组件用于单个纹素,利用根据设置在颜色分量format。颜色分量被视为一个,两个,三个或四个值的组,也是基于format。组件组被称为纹理元素。

width×height

 texels are read from memory, starting at location data. By default, these texels are taken from adjacent memory locations, except that after all width texels are read, the read pointer is advanced to the next four-byte boundary. The four-byte row alignment is specified by glPixelStorei with argument GL_UNPACK_ALIGNMENT, and it can be set to one, two, four, or eight bytes.


internalformat必须匹配format。在纹理图像处理过程中不支持格式间的转换。type可以用作提示来指定需要多少精度,但是GL实现可以选择以其选择的任何内部分辨率来存储纹理数组。

data可能是一个空指针。在这种情况下,会分配纹理内存以适应宽度width和高度的纹理height。然后你可以下载子文本来初始化这个纹理内存。如果用户尝试将纹理图像的未初始化部分应用于基元,则图像未定义。

此函数比较迷惑的地方是internalformatformat

internalformat 指定了颜色都有那些成分构成 RGB表示颜色组成由Red分量Green分量Blue分量构成,RGBA表示颜色组成由Red分量Green分量Blue分量Alpha分量构成。

format 表示了颜色数据分量在内存中的数据存储格式。

RGBA(对于大端对齐的CPU) ABGR(对于小端对齐的CPU)表示颜色在内存中的排列方式如下:


ARGB(对于大端对齐的CPU) BGRA(对于小端对齐的CPU)表示颜色在内存中的排列方式如下:


就是说format指定的是颜色分量在内存中的数据存储格式。

根据openGL es2.0 的官方文档 format Must match internalformat此处所说的must match 我认为应该理解为必须一致,而不是必须一样,一致说的是指定的RGBA的格式一致。


    官方的openGL es 2.03.0的文档表明,openGLes并不支持GL_BGRA类型的format,而opengl是支持GL_BGRA类型的format的。但是笔者在iOS6以上的设备上测试发现,

    iOS6以上的设备是支持format格式为GL_BGRA,或许是iOS对此函数进行了扩展。

    opengl es 2.0     http://docs.gl/es2/glTexImage2D

    opengl 2.0        http://docs.gl/gl2/glTexImage2D


例子  使用基于纹理的颜色附件和基于纹理的深度附件创建帧缓冲区对象。使用基于纹理的附件可以对着色器中的纹理进行采样。

// fbo_width and fbo_height are the desired width and height of the FBO.
// For Opengl <= 4.4 or if the GL_ARB_texture_non_power_of_two extension
// is present, fbo_width and fbo_height can be values other than 2^n for
// some integer n.

// Build the texture that will serve as the color attachment for the framebuffer.
GLuint texture_map;
glGenTextures(1, &texture_map);
glBindTexture(GL_TEXTURE_2D, texture_map);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, fbo_width, fbo_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

glBindTexture(GL_TEXTURE_2D, 0);

// Build the texture that will serve as the depth attachment for the framebuffer.
GLuint depth_texture;
glGenTextures(1, &depth_texture);
glBindTexture(GL_TEXTURE_2D, depth_texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, fbo_width, fbo_height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D, 0);

// Build the framebuffer.
GLuint framebuffer;
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, (GLuint)framebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_map, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_texture, 0);

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
    // Error

glBindFramebuffer(GL_FRAMEBUFFER, 0);

创建一个纹理对象使用mipmapedge clamping来创建

GLuint texture_id;
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

// texture_data is the source data of your texture, in this case
// its size is sizeof(unsigned char) * texture_width * texture_height * 4
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture_width, texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture_data);
glGenerateMipmap(GL_TEXTURE_2D); // Unavailable in OpenGL 2.1, use gluBuild2DMipmaps() insteads.

glBindTexture(GL_TEXTURE_2D, 0);

  • 13
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
openGLES2OpenGL ES的一个版本,它是用于在移动设备上进行图形渲染的API。根据引用,glClear函数用于清除指定的缓冲区,其中mask参数指定要清除的缓冲区类型。 根据引用中的示例代码,glGenTextures函数用于生成纹理对象,glBindTexture函数用于绑定纹理对象。接下来,glTexParameteri函数设置纹理对象的参数,例如纹理过滤模式、纹理包裹模式等。然后,glTexImage2D函数用于指定纹理的像素数据,包括宽度、高度、像素格式和数据等。最后,glGenerateMipmap函数用于为纹理生成多级渐远纹理。 以上是openGLES2中的一些常用函数,它们可以用于创建和处理纹理对象。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [OpenGLES glClear函数](https://blog.csdn.net/tujidi1csd/article/details/119699724)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [OpenGL ES2.0/3.0 glTexImage2D 函数详解](https://blog.csdn.net/juruiyuan111/article/details/118221422)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值