opengl-重新开始-6

6 混合 雾 多边形偏移 抗锯齿


混合: alpha 用于把被处理片段的颜色值与已经存储在帧缓冲区的像素颜色值进行组合
    在颜色索引模式下 不能指定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)


光栅位置


void glBitmap( GLsizei width,GLsizei height,GLfloat xbo,GLfloat ybo,GLfloat xbi,GLfloat ybi,const GLubyte *bitmap);  
绘制位图


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)
   选择当前纹理单位 一遍顶点数组指定纹理坐标数据
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值