您的位置:首页 > 其它

GLSL中变量传递的学习笔记

2013-07-09 10:04 281 查看
近阶段简单的学习了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运行的次数是图元光栅化的片段数据,往往片段的数量远远的大雨顶点的数量,所以获得比较好的效果往往需要在[b]Fragment shader中实现,但是通常会带来比较大的计算量,如果从优化渲染性能的角度来考虑,可以将部分[b]Fragment
shader中的计算放在vertex shader中进行。
[/b][/b]

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: