最近在学习及使用OpenGL着色器的过程中遇上了一些问题,但最终在别人的帮助下解决了,于是打算将所遇到的问题做一个总结,同时也为需要的人提供一个参考。
首先简单介绍一下OpenGL着色器,关于这个网上有很多相关资料,可以根据需要查阅,这里只是简单总结一下。简单来说,着色器在当前脚本(script)就相当于一个声明,声明你的绘制对象的维度及颜色。着色器GLSL编写,不同类型的着色器是各自独立的小程序,但最终各个着色器是会链接到一起构成一个整体程序的,例如片元着色器的输入就是顶点着色器。着色器的编写结构如下:
1.声明版本(很重要,版本不对的话会得到不同的绘制结果)。
2.使用location指定输入变量。
3.定义输入输出变量(用in和out关键字)。
4.main函数。
以下是一个简单的例子:
const char* vertexShaderSource =
"#version 300 es\n"
"layout (location = 0) in vec3 aPos;\n"
"layout (location = 1) in vec3 aColor;\n"
"out vec3 vColor;\n"
"void main()\n"
"{\n"
" vColor = aColor;\n"
" gl_Position = vec4(aPos, 1.0);\n"
"}";
const char* fragmentShaderSource =
"#version 300 es\n"
"in vec3 vColor;\n"
"out vec4 outColor;\n"
"void main()\n"
"{\n"
" outColor = vec4(vColor, 1.0);\n"
"}";
在代码中首先声明了着色器的版本,然后定义了位置属性,layout(locationg=0)和layout(locationg=1)分别代表了顶点着色器和片元着色器的位置属性,我个人的理解是这是声明了这个变量的内存位置属性,这个位置属性 也是函数glVertexAttribPointer()第一个参数的值。vec3就代表了接下来要输入的顶点的维度(x,y,z),二vec3 acolor代表了接下来要输入的颜色维度(r,g,b)。绘制时最终的颜色是需要设置为四维度的,最后一个维度为透明度。注意了,接下来是重点:
如果在着色器里面设置好透明度的话,接下来整个绘制对象的透明度都是固定的,如果想要实现绘制对象透明度或颜色渐变,那就不可以在片元着色器中设置颜色或透明度,代码如下:
const char* vertexShaderSource =
"#version 300 es\n"
"layout (location = 0) in vec3 aPos;\n"
"layout (location = 1) in vec4 aColor;\n"
"out vec4 vColor;\n"
"void main()\n"
"{\n"
" vColor = aColor;\n"
" gl_Position = vec4(aPos, 1.0);\n"
"}";
const char* fragmentShaderSource =
"#version 300 es\n"
"in vec4 vColor;\n"
"out vec4 outColor;\n"
"void main()\n"
"{\n"
" outColor = vec4(vColor);\n"
"}";
这样,我们就可以在接下来传入的顶点的颜色信息中设置不一样的颜色或透明度了。
以上,如果有用还请点个赞哦。