现在的位置: 首页 > 综合 > 正文

关于opengl中多重纹理,离屏与渲染到屏幕切换,可编程管线有固定管线切换的理解

2013年01月29日 ⁄ 综合 ⁄ 共 2641字 ⁄ 字号 评论关闭

最近用opengl写项目时遇见几个问题,感觉比较通用写下啦分享;

一,           opengl多重纹理的使用

二,           opengl离屏渲染与渲染到屏幕切换使用

三,           opengl可编程管线与固定管线切换使用

经过一个成功与失败的魔力,现在终于算是理解opengl中纹理,缓冲区对象(FBO),及着色器的使用了一下只是一己之见,错误难免,望各位指教。

1.首相说一下简单的纹理对象使用方法:

Void glGenTextures(GLsizen, GLuint * textureNames);// 得到n个未使用的纹理标示符(并不一定是连续的整数),仅仅这一个作用,纹理对象的状态及维数信息在第一次绑定才会得到;

void glBindTexture(GLenum target, Gluint name);

//创建和使用纹理对象。当一个纹理对象名初次绑定时,opengl会创建一个新的纹理对象并把纹理图像和纹理属性设置为默认值,glTexImage*(),glTexSubImage*(),glCopyTexImage*(),glCopyTexSubImage*(),glTexParameter*() 和glPrioritizeTextures()的后续调用都将存储在这个纹理对象中,纹理对象包含纹理图像及相关的mipmap图像等,被保存的纹理属性包括缩小和放大滤波器,环绕模式边框颜色和纹理优先级

glBindTexture可以完成三个不同的任务:使用一个非0的纹理对象名称第一次绑定时,创建一个性的纹理对象并把这个名称分配给他;以后再次绑定时这个纹理对像就成文活动的纹理对象;如果绑定0的纹理对象就停止使用纹理对象,并返回到无名称的默认纹理对象;

当一个纹理对象第一次绑定时(即被创建时)他的维数有target参数决定,并且纹理对象的状态立即被初始化为opengl初始化target是的默认状态,在处于初始状态时,纹理属性都设为默认值。

 

glTexImage2D(GL_TEXTURE_2D,0, GL_RGBA8,  width, height, 0, GL_RGB,GL_UNSIGNED_BYTE, NULL);

分配纹理图形空间指定纹理内部及数据格式,以下为设置纹理对象属性参数

    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);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_CLAMP);

更新纹理数据,并不会分配存储空间

       glTexSubImage2D(GL_TEXTURE_2D,0,0,0,width,height,GL_RGB,GL_UNSIGNED_BYTE,srcImgData);

glDeleteTextures(GLsize n, GLuint * textureNames)删除由textureNames指定的n个纹理对象,被释放的纹理对向名称以后可以再次分配,当一个但前使用的纹理对象被删除后,这个绑定就会恢复到默认纹理,试图删除名称为0的纹理对象,这个操作会被忽略。

2.多重纹理的使用

多重纹理引入了纹理单位每个纹理单位都拥有相同的功能,并且拥有自己的纹理状态,通过调用glActiveTexture(GLenum texUnit)选择当前纹理单位,上面介绍的glBindTexture就是把纹理对象绑定到当前纹理单位上,后续的纹理函数调用(如纹理矩阵)也只会影响当前纹理单位(OPENGL状态机的表现)

多重纹理的使用就是在先glActiveTexture选择当前纹理单位,然后创建纹理对象或将已经创建好的纹理对象调用glBindTexture重新绑定到这个当前纹理单位,设置好所需的纹理单位属性后在绘制时调用glMultiTexCoord设置对应的纹理单位的纹理坐标即可。

在固定管线中多重纹理是顺序对片断起作用的,即根据纹理单位状态,把原先的片断颜色与纹理图像进行组合,然后把上述操作产生的片断颜色传给下一个纹理单位进行处理。在编程管线中没有这个规律而是根据片段着色器中进行的处理;

 

理解纹理单位与纹理对象的关系是很重要的,纹理对象与纹理单位通过glBindTexture绑定,这点横重要;

 

3.FBO的使用

上面说了一下纹理对象,及多重纹理的使用,下面再说说FBO(帧缓冲区对象的使用)

FBO是用来进行离屏渲染的,当利用显卡进行科学计算时并不需要把数据显示到屏幕上,或者需要把一次渲染的数据保存下来供下一次渲染使用这时就用FBO

 

FBO的使用与纹理对象的使用方式类似

glGenFramebuffersEXT(1,&fbo);//得到fbo名称类似glGenTextures

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,fbo);指定一个FBO用于读取或写入,这里和纹理对象的绑定有区别;

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, img, 0);

将img纹理对象绑定到fbo的颜色缓冲区,这样渲染时就可以把渲染结果写入到img纹理对象中了;

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,0);     使用默认的帧缓冲区对像,这样就可以在离屏渲染后再把以后的结果渲染到屏幕

这里主要是对离屏渲染和渲染到屏幕进行切换的理解

4.着色器的使用

不想写详细的着色器编译连接绑定的过程了,opengl着色语言第七章写的很详细,写下来费时不也没多大的贡献,下面主要介绍一下可编程管线和固定管线交替使用的方法。其实很简单与FBO和默认FBO的切换类似

通过调用glUseProgramn(0)使用固定管线,glUseProgramn(program)(其中program是编译连接好的程序对象)使用可编程管线;

 

想把自己的东西写出来真难啊,以后继续努力,好啦今天就写到这啦

 

 

 

 

 

 

抱歉!评论已关闭.