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]
刚开始写博客,欢迎大家提意见和拍砖!
输出类型:
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]
相关文章推荐
- GLSL学习笔记---之内建变量
- GLSL学习笔记---之内建变量2
- 学习笔记:GLSL Core Tutorial – Vertex Shader(内置变量说明)
- 学习笔记:GLSL Core Tutorial – Vertex Shader(内置变量说明)
- openGL学习笔记二 着色器语言GLSL变量
- python学习笔记11(函数二): 参数的传递、变量的作用域
- GLSL学习笔记---内置变量
- NGINX学习笔记——传递请求头
- C/C++中关于地址、指针和引用变量的学习笔记(十) : 引用型变量
- 吴恩达机器学习--单变量线性回归【学习笔记】
- C++ Primer学习笔记 之 变量的声明与定义
- 【IOS学习笔记(一)】IOS中.h和.m文件中的变量和方法
- C# 从入门到精通 学习笔记1 第2章 使用变量、操作符和表达式
- 【学习笔记】关于变量类型的一些知识
- Java学习笔记38:通过Spring Bean 注入static变量,来设计一套适合测试,开发,生产环境的配置项
- Java学习笔记--变量
- java学习笔记15--引用传递
- PHP5学习笔记-变量
- java学习笔记3--参数的传递方式