GLSL中变量传递的学习笔记

近阶段简单的学习了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中进行。
 

 

你可能感兴趣的:(GLSL中变量传递的学习笔记)