所有的OpenGL对象都差不多,它们都有状态。想象一下它们是类似如下的结构体。
struct Object
{
int count;
float opacity;
char *name;
};
此结构体有几个状态成员,OpenGL同样也有状态。
改变状态
在 C/C++中,如果你有一个实例,可以按如下改变其状态obj.count = 5; 你可以直接去获取对象属性,然后取直接对它赋值。
但是在OpenGL中,你不能这么做。
由于历史遗留原因(或无法解释的其它原因),在OpenGL中你想改变对象的状态,你必须绑定它到上下文。这也就是为什么先要调用 glBind* 函数。
glBind* 函数类似于C/C++ 中如下操作:
Object *g_objs[MAX_LOCATIONS] = {NULL};
void BindObject(int loc, Object *obj)
{
g_objs[loc] = obj;
}
纹理很有趣,它的绑定比较特殊。很多 glBind函数都有“目标”(target)参数。这代表不同的位置在OpenGL上下文中。比如绑定帧缓时,有参数可选(GL_FRAMEBUFFER/GL_READ_FRAMEBUFFER/GL_Draw_FRAMEBUFFER*), 这将会影响OpenGL对frame buffer的使用。这和上面的loc参数相对应。
纹理特别之处在于当你绑定到目标时,OpenGL得到一些别的信息。当你先绑定纹理到GL_TEXTURE_2D, 你实际上在告诉OpenGL,此纹理为2D纹理。然后它必须一直是2D纹理,不能更改。当你试图绑定它到GL_TEXTURE_1D 或者别的纹理目标时,都会在运行时报错。
在绑定之后,调用诸如 glTexImage2D/glTexParameteri等函数,更改的就是当前绑定的纹理对象。
显卡中有N个纹理单元(具体数目依赖你的显卡能力),每个纹理单元(GL_TEXTURE0、GL_TEXTURE1等)都有GL_TEXTURE_1D、GL_TEXTURE_2D等
一、纹理
1.glGenTextures(GLsizei n, GLuint *textures)
是用来生成纹理的函数。
glGenTextures(GLsizei n, GLuint *textures)函数说明
n:用来生成纹理的数量
textures:存储纹理索引的第一个元素指针
glGenTextures就是用来产生你要操作的纹理对象的索引的,比如你告诉[OpenGL],我需要5个纹理对象,
它会从没有用到的整数里返回5个给你
[glBindTexture]实际上是改变了OpenGL的这个状态,它告诉OpenGL下面对纹理的任何操作都是对它所绑定的
纹理对象的,比如glBindTexture(GL_TEXTURE_2D,1)告诉OpenGL下面代码中对2D纹理的任何设置
都是针对索引为1的纹理的。
产生纹理函数假定目标纹理的面积是由glBindTexture函数限制的。
先前调用glGenTextures产生的纹理索引集不会由后面调用的glGenTextures得到,
除非他们首先被glDeleteTextures删除。你不可以在[显示列表]中包含glGenTextures。
2.glActiveTexture(GL_TEXTURE0);
激活纹理
glActiveTexture(GL_TEXTURE0);
3.glTexParameteri
纹理过滤
图象从纹理图象空间映射到帧缓冲图象空间(映射需要重新构造纹理图像,这样就会造成应用到多边形上的图像失真),这时就可用glTexParmeteri()函数来确定如何把纹理象素映射成像素.
部分参数功能说明如下:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
GL_TEXTURE_2D: 操作2D纹理.
GL_TEXTURE_WRAP_S: S方向上的贴图模式. GL_CLAMP: 将纹理坐标限制在0.0,1.0的范围之内.如果超出了会如何呢.不会错误,只是会边缘拉伸填充.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
这里同上,只是它是T方向
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
这是纹理过滤
GL_TEXTURE_MAG_FILTER: 放大过滤
GL_LINEAR: 线性过滤, 使用距离当前渲染像素中心最近的4个纹素加权平均值.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
GL_TEXTURE_MIN_FILTER: 缩小过滤
GL_LINEAR_MIPMAP_NEAREST: 使用GL_NEAREST对最接近当前多边形的解析度的两个层级贴图进行采样,然后用这两个值进行线性插值.
4.glBindTexture(GLenum target, GLuint texture);
绑定纹理
void glBindTexture(GLenum target, GLuint texture);
参数说明:
target
指明了纹理要绑定到的目标。必须是下面中的一个:
GL_TEXTURE_1D,
GL_TEXTURE_2D,
GL_TEXTURE_3D,
GL_TEXTURE_1D_ARRAY,
GL_TEXTURE_2D_ARRAY,
GL_TEXTURE_RECTANGLE,
GL_TEXTURE_CUBE_MAP,
GL_TEXTURE_CUBE_MAP_ARRAY,
GL_TEXTURE_BUFFER,
GL_TEXTURE_2D_MULTISAMPLE 或者
GL_TEXTURE_2D_MULTISAMPLE_ARRAY。
texture
指明一张纹理的名字
二、着色器
1.glCreateShader
创建着色器
##名称
glCreateShader - 创建一个着色器对象
## C规范
GLuint glCreateShader(GLenum *shaderType*)
## 参数
*shaderType*
指定要创建的着色器的类型。 只能是**GL_VERTEX_SHADER**或**GL_FRAGMENT_SHADER**。
## 描述
**glCreateShader**创建一个空的着色器对象,并返回一个可以引用的非零值(shader ID)。着色器对象用于维护定义着色器的源代码字符串。*shaderType*指示要创建的着色器的类型。 支持两种类型的着色器。 **GL_VERTEX_SHADER**类型的着色器是一个用于在可编程顶点处理器上运行的着色器。 **GL_FRAGMENT_SHADER**类型的着色器是一个着色器,旨在在可编程片段处理器上运行。
创建时,着色器对象的**GL_SHADER_TYPE**参数设置为**GL_VERTEX_SHADER**或**GL_FRAGMENT_SHADER**,具体取决于*shaderType*的值。
2.glBindAttribLocation -
将通用顶点属性索引与命名属性变量相关联
## C规范
void **glBindAttribLocation**(GLuint *program*, GLuint *index*, const GLchar **name*);
## 参数
*program*
指定要在其中建立关联的程序对象的句柄。
*index*
指定要绑定的通用顶点属性的索引。
*name*
指定一个以空终止符结尾的字符串,其中包含要绑定索引的顶点着色器属性变量的名称。
## 描述
**glBindAttribLocation**用于将程序指定的程序对象中的用户定义属性变量与通用顶点属性索引相关联。
用户定义的属性变量的名称作为名称中的空终止字符串传递。
要绑定到此变量的通用顶点属性索引由*index*指定。
当程序成为当前状态的一部分时,通过通用顶点属性索引提供的值将修改由*name*指定的用户定义属性变量的值。
5.glTexImage2D()
生成一个2D纹理
glTexImage2D(GLenum target, GLint level, GLenum internalformat,
GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);
glteximage2d是一个OpenGL函数,功能是根据指定的参数,生成一个2D纹理(Texture)。相似的函数还有glTexImage1D、glTexImage3D。
参数说明:
target 指定目标纹理,这个值必须是GL_TEXTURE_2D。
level 执行细节级别。0是最基本的图像级别,n表示第N级贴图细化级别。
internalformat 指定纹理中的颜色组件。
可选的值有GL_ALPHA,GL_RGB,GL_RGBA,GL_LUMINANCE, GL_LUMINANCE_ALPHA 等几种。
width 指定纹理图像的宽度,必须是2的n次方。纹理图片至少要支持64个材质元素的宽度
height 指定纹理图像的高度,必须是2的m次方。纹理图片至少要支持64个材质元素的高度
border 指定边框的宽度。必须为0。
format 像素数据的颜色格式, 不需要和internalformatt取值必须相同。可选的值参考internalformat。
type 指定像素数据的数据类型。可以使用的值有GL_UNSIGNED_BYTE,GL_UNSIGNED_SHORT_5_6_5,GL_UNSIGNED_SHORT_4_4_4_4,GL_UNSIGNED_SHORT_5_5_5_1。
pixels 指定内存中指向图像数据的指针
功能
该函数的功能是,根据指定的参数,生成一个2D纹理(Texture)。相似的函数还有glTexImage1D、glTexImage3D。
需注意的是,internalformat的取值,OpenGL ES2.0和OpenGL 1.0是不同的。OpenGL1.0版本支持的取值是1,2,3,4,
在部分系统下可以向前兼容,但不是所有的系统下都支持向前兼容,所以在使用OpenGL ES 2.0时最好传入上面所述的那些值作为实际参数。
在调用该函数之前,
必须调用glBindTexture(GL_TEXTURE_2D, mTextureID );以指定要操作的纹理ID,此处是mTextureID。
网友评论