【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函数中加上纹理坐标的设置之后一切都变得正常了。
这个故事告诉我们:写程序的时候想当然是最可怕的。。
先整理下怎么用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();
相关文章推荐
- 【OpenGL学习】使用Shader做图像处理
- 学习使用Shader处理纹理
- Shader学习笔记(六)_Time的使用,会动的纹理
- OpenGL学习笔记(十三):将纹理贴图应用到四边形上,对VAO/VBO/EBO/纹理/着色器的使用方式进行总结
- Unity Shader入门精要学习笔记 - 第13章 使用深度和法线纹理
- OpenGL学习笔记(十二):纹理的使用
- OpenGL使用OpenCV处理图像进行纹理映射的使用范例
- OpenGL学习之纹理使用
- OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形
- OpenGL入门学习——第十一课 纹理的使用入门
- 图像处理之基础---用Shader实现的YUV到RGB转换:使用3重纹理实现 .
- OpenGL入门学习之十一——纹理的使用入门
- 【cocos2d-x 2.x 学习与应用总结】10: cocos2d-x自带的shader及其使用
- OpenGL学习 将不同纹理映射到不同面上
- 处理opengl使用fbo贴图时产生的锯齿
- lua学习:使用Lua处理游戏数据
- lua学习:使用Lua处理游戏数据
- OpenGL学习笔记:纹理
- Qt 学习之路 2(61):使用 SAX 处理 XML
- OpenGL入门学习[十一 03]bmp纹理