纹理 texture
2D纹理
2D纹理是一个二维的图像数据阵列,贴图的坐标写作(s,t)图像的左下角是坐标(0,0)。
立方体纹理
由六个独立的2d纹理组成的,在3D渲染时有很有很多优点,最基本的用法是环境映射。
纹理对象
贴图应用的第一步是创建纹理对象。贴图对象是包含一个图片数据过滤模型包装模型等用于贴图数据的容器。
void glGenTextures(GLsizei n, GLuint *textures)
void glDeleteTextures(GLsizei n, GLuint *textures)
n是指定贴图对象的数量。textures指针存储贴图对象id值的句柄。创建对象后需要绑定和装载数据到对象,绑定使用glBindTexture;基本的装载数据是glTexImage2D。
void glBindTexture(GLenum target, GLuint texture)
void glTexImage2D(GLenum target, GLint level, GLenum internalFormat,
GLsizei width, GLsizei height, GLint border,
GLenum format, GLenum type, const void* pixels)
glBindTexture:target绑定贴图对象到目标GL_TEXTURE_2D或GL_TEXTURE_CUBE_MAP;texture是纹理对象句柄。
glTexImage2D:target指定对象目标,GL_TEXTURE_2D或者立方体纹理的一个面(如GL_TEXTURE_CUBE_MAP_POSITIVE_X GL_TEXTURE_CUBE_MAP_NEGATIVE_X等),level装载mip级别(mip以后会讲到)最低级别是0,后续的级别是递增的,internalFormat存储内部格式(GL_RGBA,GL_RGB,GL_LUMINANCE_ALPHA,GL_LUMINANCE,GL_ALPHA),width height是图像宽高。border指定边框的宽度,必须为0。format指定像素数据的颜色格式,必须和internalFormat相同。type指定像素数据的数据类型,可选值:GL_UNSIGNED_BYTE GL_UNSIGNED_SHORT_4_4_4_4 GL_UNSIGNED_SHORT_5_5_5_1 GL_UNSIGNED_SHORT_5_6_5。pixels指定内存中指向图像数据的指针。
纹理数据
void glPixelStorei(GLenum pname, GLint param);
设定像素存储模式,pname指定要设置参数的符号名。有两种GL_PACK_ALIGNMENT它影响将像素数据写回到主存的打包形式,对glReadPixels的调用产生影响。GL_UNPACK_ALIGNMENT它影响从主存读到的像素数据的解包形式,对glTexImage2D以及glTexSubImage2D产生影响;param指定相应的pname的值,这个值一般是1、2、4或8,用于指定存储器中每个像素行有多少个字节对齐。对齐的字节数越高,系统就越能优化。
设置纹理参数
void glTexParameteri(GLenum target, GLenum pname, GLint param);
target指定纹理类型,pname可以是GL_TEXTURE_MIN_FILTER缩小情况,GL_TEXTURE_MAG_FILTER放大情况。param是给pname指定算法,GL_NEAREST是最邻近算法,GL_LINEAR是双线性插值算法。
着色器中的使用
片段着色器可以声明sampler2D,samplerCube的uniform采样器,分别对应2D纹理和立方体纹理。采样器uniform将装载指定的已经绑定过的贴图单元。指定贴图绑定到贴图单元的方法是glActiveTexture函数。
void glActiveTexture(GLenum texture)
texture激活的贴图单元,GL_TEXTURE0,GL_TEXTURE1等。设定当前的贴图单元,以至后面将使用glBindTexture来绑定贴图到当前的单元。最大贴图数目可以使用GL_MAX_TEXTURE_IMAGE_UNITS为参数调用glGetIntegeriv查询。
片段着色器使用内建函数 textureCube 去进行贴 图,法线作为贴图坐标。
vec4 textureCube(samplerCube sampler, vec3 coord[,float bias])
sampler绑定到贴图单元的采样器,指定获取的贴图;coord被用于立方体贴图的3D贴图坐标;bias用于获取贴图提供多级纹理偏置的可选参数,允许着色器解释计算LOD值的偏置,被用于多级纹理选择。
2D纹理栗子
创建部分的代码如下,完整代码请前往github的tag:lesson7。
// shader:
static const char gVertexShader[] =
"attribute vec4 a_position; \n"
"attribute vec2 a_texCoord; \n"
"varying vec2 v_texCoord; \n"
"void main() \n"
"{ \n"
" gl_Position = a_position; \n"
" v_texCoord = a_texCoord; \n"
"} \n";
static const char gFragmentShader[] =
"precision mediump float; \n"
"varying vec2 v_texCoord; \n"
"uniform sampler2D s_texture; \n"
"void main() \n"
"{ \n"
" gl_FragColor = texture2D( s_texture, v_texCoord );\n"
"} \n";
// create texture:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, gPixels);
// Set the filtering mode
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
gPixels是一个宽高都为2的GLubyte矩阵,这里图像大小会被放大,放大采用最邻近算法。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。