6 混合 雾 多边形偏移 抗锯齿
在颜色索引模式下 不能指定alpha值 因此混合操作在颜色索引模式下是非法的
混合颜色公式:
RsSr+RdDr,GsSg+GdDg,BsSb+BdDb,AsSa+AdDa
元和混合隐私分别是 (Sr,Sg,Sb,Sa) 和 (Dr,Dg,Db,Da)
void glBlendFunc(GLenum srcfactor,GLenum destfactor)
控制 被处理片段的颜色值(源片段)如何与已经存储在帧缓冲区(目标像素)的像素的颜色值进行组合
glEnable(GL_BLEND)
void glBlendFunc(GLenum srcfactor,GLenum destfactor)
void glBlendColor(GLclampf red,GLclampf green, GLclampf blue,GLclampf alpha)
---------------------
7 显示列表
显示列表是一组存储在一起的OpenGL函数,可以在以后执行。调用一个显示列表,它所存储的函数就会按照顺序执行
GLuint glGenLists(GLsizei range)
分配range个连续的、以前从未分配的显示列表索引
void glNewList(GLuint list, GLenum mode)
指定了一个显示列表的开始
void glEndList(void)
显示列表定义的结束
所有有返回值的函数都不在显示列表 以及 用于修改客户状态的函数 和用于指定顶点数组的函数
void glCallList(GLuint list)
执行显示列表
8 绘制像素 位图 图像
void glRasterPos{234}{sifd}(TYPEx,Type y,Type z,Type w)
void glRasterPos{234}{sifd}(const Type*coords)
光栅位置
绘制位图
9 纹理贴图
1).简单的说 纹理就是矩形的数据数组。 颜色数据、亮度数据、颜色和alpha数据。
纹理数组中的单个值常常称为纹理单元
纹理贴图的步骤:
·创建纹理对象,并为它指定一个纹理
·确定纹理如果应用到每个像素上
·启用纹理贴图功能
·绘制场景,提供纹理坐标和几何图形坐标
纹理坐标必须在RGBA的模式下才能使用
void glTexImage2D(GLenum target,GLint level,GLint internalFormat,GLsizei width
,GLsizei height,GLinit border,GLenum format, GLenum type,constant GLvoid*texels)
定义一个二维纹理,或者一个一维纹理数组。
target:GL_TEXTURE_2D、GL_PROXY_TEXTURE_2D、GL_RPOXY_TEXTURE_CUBE_MAP
GL_TEXTURE_CUBE_MAP_NEGATIVE_X(Y、Z)、GL_TEXTURE_CUBE_MAP_POSTIVE_(X/Y/Z)--二维纹理
GL_TEXTURE_ID_ARRAY、GL_PROXY_TEXTURE_ID_ARRAY--一维纹理数组
或者GL_TEXTURE_RECTAGLE/GL_PROXY_RECTANGLE
level:提供几种分辨率的纹理图像,如果只有一种:0
iternalFormat:确定了哪些成分(RGBA、深度、亮度或强度)被选为图像的纹理单元
width、height、border:图像的宽度 高度 边框的宽度(0/1)
format:纹理的格式:GL_RGB\GL_RGBA、GL_COLOR_INDEX、GL_DEPTH_COMPONET等
type:纹理的数据类型 GL_BYTE GL_UNSIGNED_BYTE、GL_SHORT等
texels:包含了纹理图像数据
void glCopyTexImage2D(GLenum target,GLinit level, GLint internalFormat
,GLint x,GLint y,GLsizei width,GLsizei height,GLint border);
使用帧缓冲区的数据来定义纹理单元,像素是从前的GL_READ_BUUFER读取的
纹理代理:特殊的占位符 判断一个纹理能不能被夹在到纹理内存中
替换纹理图像的全部或一部分:glTexSubImage2D / glCopyTexSubImage2D:来自帧缓冲区的图像数据替代当前现有的图像的部分区域
纹理矩形的纹理 不能基于mipmap的过滤 也不能压缩
一维纹理:
void glTexImageID(GLenum target,GLint level,GLint internalFormat,GLint widht
GLint border,GLenum format,GLenum type,const GLvoid* texels)
同理:glTexSubImageID / glCopyTexImage1D、glCopyTexSubImage1D跟上面的介绍雷同
压缩纹理图像===可以用一种压缩格式存储 以减少他说使用的内存数量,也可以在加载时进行压缩
加载经过压缩的纹理图像
void glCompressedTexImage1D(2D/3D)(GLenum target,GLint level,GLint internalFormat,GLint widht
GLint border,GLsizei imageSize,const GLvoid *texels)
mipmap:必须提供全系列的大小为2的整数次方的纹理图像
如原图64*16 还必须提供32*8/16*4/8*2/4*1 2*1 1*1
对应的level:0 1 2 3 4 5 6
过滤:纹理单元跟最终屏幕像素很难形成一一对应,所以添加过滤
参数GL_NEAREST:靠近像素中心的纹理将用于放大或缩小,会形成锯齿
GL_LINEAR:会取2*2纹理单元取加权平均值
2)纹理对象
·生成纹理名称
·初次把纹理对象绑定到纹理数据上,包括图像数据和纹理属性
·如果OpenGL实现支持高性能纹理工作集,可以检查一下是否有足够的空间容纳所有对象,如果空间不足,可以为各个纹理对象
建立优先级,把最常用的纹理对象保存在这个工作集
·绑定和重新绑定纹理对象,使他们的数据当前可以用于渲染纹理模型
2.1·命名纹理对象
为避免意外重名,应该坚持使用glGenTextures函数来提供未使用的纹理对象名称
void glGenTextures(GLsizei n,GLuint *textureNames)
2.2·创建和使用纹理对象
void glBindTexture(GLenum target,GLuint textureName)
2.3·清除纹理对象
void glDeleteTextures(GLsizei n, const GLuint *textureNames);
2.4·常驻纹理工作集
有些OpenGL实现支持高性能的纹理工作集,称为 常驻纹理
在性能优先的原则下,尽可能使初始化阶段加载所有的纹理并使他们称为常驻纹理,如果内存不够
可能要减少纹理的大小 分辨率 mipmap层数量 或者使用glTexSubImage*()函数反复使用同一块纹理内存
void glPrioritizeTextures(GLsizei n,const GLuint* textureNames,const GLclampf* priorities)
像n个纹理对象分配纹理常驻优先级,优先级高的增加常驻的概率,优先级低的在内存紧张时会被优先释放。
纹理绑定之前没效果 priorities
glTexParameter*()也可以用于设置当个纹理的优先级
优先级相同 : LRU least recently used :最少使用策略 移除
3)纹理函数
void glTexEnv{if}(GLenum target,GLenum pname,Type param);
void glTexEnv{if}v(GLenum target,GLenum pname,const TYPE* param);
设置当前的纹理函数。
target:GL_TEXTURE_FILTER_CONTROL、GL_TEXTURE_ENV
如果target是..CONTROL那么pname必须是GL_TEXTURE_LOD_BIAS param必须是浮点数,作为mipmap细节层参数的偏移值使用
target是...ENV 并且pname是GL_TEXTURE_ENV_MODE 那么param必须是GL_DECAL GL_REPLACE GL_MODULATE、GL_BLENT
GL_ADD或GL_COMBINE之一 表示温立志应该如何与被处理的片段颜色值进行组合。 如果pname为GL_TEXTURE_ENV_COLOR 那么param
就是包含了4个浮点值(R、G、B、A)的数组 表示用于GL_BLENT操作的颜色。
target是GL_POINT_SPRITE, pname:CL_COORD_REPLACE para:GLTRUE: 启用围绕一个点块纹理的坐标进行迭代
param:FALSE:图元周围的纹理保持不变
void glTexCoord{1234}{sifd}(TYPE coords)
void glTexCoord{1234}{sifd}(const TYPE*coords);
设置当前纹理坐标(s,t,r,q) 接下来glVertex*的调用将导致当前纹理坐标被分配给这个函数所指定的顶点
4)纹理坐标自动生成
void glTexGen{ifd}(GLenum coord,CLenum pname,TYPE param);
void glTexGen{ifd}(GLenum coord,GLenum pname,const TYPE*param);
用于自动生成纹理坐标的函数
coord:GL_S、GL_T、GL_R、GL_Q
pname:GL_TEXTURE_GEN_MODE、GL_OBJECT_PLANE GL_EYE_PLANE
param:(GL_TEXTURE_GEN_MODE时)GL_OBJECT_PLANE/GL_EYE_PLANE/GL_SPHERE_MAP/GL_REFLECTION_MAP/GL_NORMAL_MAP
其他值是一个数组
5)多重纹理
void glActiveTexture(GLenum texUnit):选择可以由纹理函数进行修改的当前纹理单元
texUint: GL_TEXTUREi : 0<i<k-1 k是纹理单位的最大数量
void glMultiTexCoord{1234}(GLenum texUnit,TYPE coords)
void glMultiTexCoord{1234}v(GLenum texUnit,const TYPE* coords)
将参数coords中的纹理坐标数据用于纹理单位 texUnit
void glClientActiveTexture(GLenum texUnit)
选择当前纹理单位 一遍顶点数组指定纹理坐标数据