您的位置:首页 > 运维架构

【OpenGL学习】使用Shader处理纹理

2012-08-01 21:28 211 查看
使用Shader处理纹理本是件简单的事情,但是我在尝试写一个简单的例子的时候却犯了个错误,导致郁闷了一天,这个稍后再说。
先整理下怎么用Shader处理纹理吧。

1.原理:

用Shader处理纹理的原理其实很简单,将纹理通过一个uniform变量传入shader,然后对着个uniform变量进行操作,就可以直接操作纹理了。

2.参考资料

lighthouse3d上面的教程比较简略,没有列出完整的程序,我看后比较迷茫。http://www.lighthouse3d.com/tutorials/glsl-tutorial/simple-texture/
写得比较详细的是这么一本书:OpenGL® Shading Language, Second Edition,Chapter10.2有比较详细的介绍。电子版地址:http://wiki.labomedia.org/images/1/10/Orange_Book_-_OpenGL_Shading_Language_2nd_Edition.pdf
总结下大体思路就是:生成纹理——绑定纹理——设置纹理——激活纹理——传递变量给shader

3.题外话

下面该说说我犯的这个错误了。重点在于我傻乎乎的以为纹理坐标已经不需要设置了(display函数中),Shader会智能地处理这些。仔细想想其实这种想法很不合理,因为Shader并不知道纹理坐标和顶点坐标的对应关系,比如
某个顶点应该对应纹理的左上还是左下坐标。所以当我在display函数中加上纹理坐标的设置之后一切都变得正常了。
这个故事告诉我们:写程序的时候想当然是最可怕的。。

4.代码

最后贴上代码吧,供以后查阅。

vertex shader代码:

 = gl_MultiTexCoord0]uniform sampler2D sampler0;
void main()
{
vec3 lightColor = vec3(texture2D(sampler0, gl_TexCoord[0].st));
gl_FragColor = vec4(1-lightColor, 0.0);//反色
}

纹理设置代码:

GLuint texLoc = glGetUniformLocation(p, "sampler0");
glUniform1i(texLoc,0);

显示代码:

glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0, -1.0,0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(1.0, -1.0,0.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0, 1.0,0.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(-1.0, 1.0,0.0);
glEnd();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: