近阶段简单的学习了GLSL,对于很多新手,可能主要就是GLSL中shader与opengl之间的变量传递问题存在障碍,下面把学习的笔记晒一晒,希望能帮助大家。
刚开始写博客,欢迎大家提意见和拍砖!
输出类型:
vertex shader :gl_Position
Fragment shader :gl_FragColor gl_FragDepth
1、属性数据 attribute 顶点属性,向vertex shader中传递
1、默认内置属性数据 gl_Color gl_Normal gl_Vertex gl_TextCoord,这些顶点属性由opengl程序向shader中发送
在vertex shader中可以直接调用gl_Color这样的写法
2、自定义属性
//attribute
int my_vec3_location = glGetAttribLocationARB(my_program,“my_3d_vector”);//定义一个my_3d_vector的量,每 个顶点设置它的值
glBegin(GL_TRIANGLES);
glVertexAttrib3f(my_vec3_location, 4.0f, 2.0f, 7.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
glVertexAttrib3f(my_vec3_location, 2.0f, 9.0f, 2.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertexAttrib3f(my_vec3_location, 1.0f, 0.0f, 5.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glEnd();
在vertex shader中:
attribute vec3 my_3d_vector;//这样就能接受到了
2、一致变量 Uniform 提供相对不变的参量,Opengl向vertex shader或Fragment shader传递数据,在shader中是只读的
Uniform 使用:
1、在application中声明
GLint my_color;
my_color = glGetUniformLocation(p,"define_color");//p是glCreateProgram()创建的,define_color是变量名称
glUniform4f(my_color, 0.0,1.0,0.0,0.0);
2、在shader中
uniform vec4 define_color;//声明
void main()
{
gl_FragColor= define_color;//使用
}
3、易变变量 varying 由vertex shader向Fragment shader中传递数据
varying vec4 ambient;//vertex shader中声明,具体操作
varying vec4 ambient;//Fragment shader中声明,可以使用
关于varying 变量,每一次在vertex shader中定义,在Fragment shader中使用,栅格化过程将为每一个片段采取差值的过程,所以varying在管线的过程中是容易改变的。同时这也证明了,管线中vertex shader运行的次数就是顶点的数量,但是Fragment shader运行的次数是图元光栅化的片段数据,往往片段的数量远远的大雨顶点的数量,所以获得比较好的效果往往需要在Fragment shader中实现,但是通常会带来比较大的计算量,如果从优化渲染性能的角度来考虑,可以将部分Fragment shader中的计算放在vertex shader中进行。