如何查看glsl 统一变量内置变量的数据

博客访问: 872576
博文数量: 311
博客积分: 8800
博客等级: 中将
技术积分: 3342
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
作为一个图形应用程序的一部分,shader定义了这个程序的图形渲染指令。但要让系统按照我们的设计去渲染图形,我们还需要把必要的数据传递给shader。shader是由gpu来负责执行的,那么数据如何能按照我们的要求传入shader,由gpu来获取呢?首先我们来粗略地了解一下shader中的数据类型吧。因为处理器不一样,shader也有一些自己特有的数据类型。标量数据类型有float, int, bool;矢量数据类型有vec2, vec3, vec4,即2、3、4维向量,其中的分量可以是三种标量数据类型中的任何一种),然后是矩阵,同样也有2、3、4维;采样器数据类型有6种:sampler1D,sampler2D,sampler3D,samplerCube,sampler1DShadow和sampler2DShadow。它们的功能是用于纹理采样;此外,还有跟c/c++一样的“结构体”,“数组”等。 shader中的数据可以分为如何三类: 1. Attribute类型。这一类数据是shader中变化频率最快的,它由应用程序传递到vertex shader,为每一顶点指定,一般是描述顶点的属性,如坐标、颜色、法线等。在opengl中,glVertex, glNormal等指令都会把这类数据传递给vertex shader。 2. Uniform类型。这一数据的变化频率相对比较低,一般来说全局的渲染属性就属于这一类数据,如光源的参数、视点的位置等,它们对于所有顶点来说都是一样的。 3. Varying类型。这种类型用于从vertex shader往pixel shader传递数据,vertex shader的计算结果通过它们流入到pixel shader环节。此外,GLSL还有一些内建的uniform和常量类型数据,它们以gl_打头,如uniform mat4 gl_ModelViewMatrix,const int gl_MaxLights = 8 等。在定义自己的变量时需要注意命名冲突的问题。以上是GLSL中数据类型的粗略介绍,详细的内容大家可以参考一下《OpenGL Shading Language, Second Edition》一书,感兴趣的朋友可以向我索取。下面我们转入今天的核心话题:数据传递。对于第1种数据类型——Attribute,OpenGL使用常规的顶点设置指令来传递相关数据,如前面我们提到的glVertex, glNormal等指令。比如glVertex,在指定了顶点的坐标之后,内建数据变量gl_Vertex(attribute vec4 gl_V)的值会被修改为glVertex指令所指定的值,然后这个值可以由vertex shader中的代码所使用。不过这仅限于系统内置的数据,对于可编程的图形流水线来说,要制造出精美复杂的渲染效果仅仅靠这一些内置的数据是不够的,通常情况下我们需要传入一些具有其他含义的数据给shader,这些数据将存入由OpenGL为其预留的空间。我们来看看下面的指令。指令void glVertexAttrib{1|2|3|4}{s|f|d}(GLuint index, TYPE v) 可以用来指定自定义的attribute数据。这跟OpenGL的其他顶点属性指令在使用上是一样的。其中的index指定了存入的位置(我们可以这么认为),vertex shader可以从这些位置把数据读取出来。另外,还有一些类似的指令,提供了对数组类型、单位化(即绝对值不超过1.0)数据的传递,如下: void glVertexAttrib{1|2|3}{s|f|d}v(GLuint index, const TYPE *v) [数组类型] void glVertexAttrib4{b|s|i|f|d|ub|us|ui}v(GLuint index, const TYPE *v)[数组类型] void glVertexAttrib4Nub(GLuint index, TYPE v) [单位化] void glVertexAttrib4N{b|s|i|f|d|ub|us|ui}v(GLuint index, const TYPE *v)[单位化]更为通用的一种指令是 void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer) 这条指令需要如下指令来配合使用 void glEnableVertexAttribArray(GLuint index)[打开该vertex attribute array] void glDisableVertexAttribArray(GLuint index)[关闭该vertex attribute array]实际上它们跟打开和关闭OpenGL客户端状态的使用方法是一样的。 OK,到此我们已经完成了一半的工作,在启动绘图指令之后(如glDawXxxx系列),应用程序便会把数据传递给shader。剩下的一半工作就是shader如何来访问传入的数据。第一种方案是所有的工作都由GLSL的链接器自动来完成,然后向OpenGL查询需要访问的数据。[用得较少,书中未详细说明,在此略过.....]。第二种方案是绑定,即由应用程序明确的表示把哪些索引(存储位置)绑定到哪些变量(名称),这样,在shader中直接引用变量的名称就可以了,如下: void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name) 该指令把某个shader程序(program)中的index(存储位置)与变量name(变量名称)绑定。这样,程序通过把数据存储到index指定的位置,绑定之后,shader就可以通过name来访问,跟普通变量的使用方式一样。与之相对应的还有一条查询指令,用于查询shader中某个变量所对应的存储区索引位置: GLint glGetAttribLocation(GLuint program, const GLchar *name) 绑定指令可以将一个位置绑定到多个变量,即别名机制,就如同c++里可以创建引用一样;但是一个变量不能对应到多个索引位置,这一点比较容易理解;同时,并非所有的绑定都会生效。如果shader中没有使用某个变量,而这个变量被使用了绑定指令,则它是处于非激活状态的,对于这样的变量GLSL在处理过程中会把它优化掉。通过指令 void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) 可以查询变量的激活状态。这是Attribute类型的数据传递方式。对于Uniform数据,没有“绑定”,而是通过查询对应变量对应的索引位置来设置。使用方式与Attribute类似,对应于下面一组指令: void glUniform{1|2|3|4}{f|i}(GLint location, TYPE v)[指定普通变量] void glUniform{1|2|3|4}{f|i}v(GLint location, GLuint count, const TYPE v)[指定数组变量] void glUniformMatrix{2|3|4}fv(GLint location, GLuint count, GLboolean transpose, const GLfloat *v)[指定矩阵变量] GLint glGetUniformLocation(GLuint program, const GLchar *name)[查询] void glGetUniformfv(GLuint program, GLint location, GLfloat *params)[查询数组] void glGetUniformiv(GLuint program, GLint location, GLint *params)[查询数组] void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name)[查询激活的变量]需要注意一点的是,与Attribute类型不同,Uniform可以定义结构体变量,而结构体变量是无法直接查询的,只能查询到它的成员。比如,A是一个结构体,那么glGetUniformLocation( program, "A" )是无效的,而glGetUniformLocation( program, "A.b" )是有效的(b是A的一个成员变量)。其他的与Attribute类型基本一致。对于采样器类型,则有其专用的指令:glUniform1i 和 glUniform1iv。实际就是把对应的纹理单元编号传递给shader。以上就是关于数据传递的主要内容。还有一些特殊的情况,用得相对较少,在后续涉及到的时候再跟大家一起讨论。好了,我该继续学习去了,之后再跟大家一起分享我的学习成果^_^
本文来自CSDN博客,转载请标明出处:
阅读(2302) | 评论(1) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
楼主你好,最近我在学shader的时候,有一个问题一直困扰我很久,希望楼主可以指导问题:&对于GLSL内置的变量,比如:gl_Vertex,gl_Normal;之类的变量,从OpenGL代码里面该怎么传递参数这些内置变量呢???我看了好多资料,讲解的都只是GLSL,并没有发现怎么和这些内置变量交互,难道也是通过&glVertexAttrib()这类函数吗???另外想问一下,楼主在写shader的时候,一般都用什么软件调试啊?我用shaderDesigner,也没有发现该怎么传递参数给gl_Vertex,gl_Normal这些内置变量;网上的一些例子,都只是给出shader,希望楼主可以给个demo,先谢谢了
请登录后评论。OpenGL(2)
本文转载自:
重点标注(与 C 语言不同的地方)
1.变量名不能以 gl_ 作为前缀,而且还有一些 GLSL 保留的名称是不能作为变量名称的;
2.新增向量基本类型与矩阵基本类型,命名规则:C 语言基本类型第一个字母 + vec + 长度说明,或者是 mat + 矩阵长x宽,但是这里面似乎没有看到 long、unsigned、char、short、double、long double;
3.GLSL 只能使用一维数组,不存在指针、取地址的情况,变量目前只看到形似的局部变量,没有看到堆上、全局、静态类型的变量;
4.操作符方面禁用所有位运算操作符、求模运算符及两者的复合赋值运算符;
5.切记 OpenGL 的矩阵是主列存储的,和 DirectX 以及大学线代学习的行存储矩阵有本质不同!因此将转置记做^,根据(AB)^ = B^A^,所以矩阵运算时,对于行存储中一个 m * n 的矩阵乘以一个 n * q 的矩阵必会得到 m * q 的矩阵,在 OpenGL 中的运算就会变成如下:
6.函数不允许递归。
GLSL的变量命名方式与C语言类似。变量的名称可以使用字母,数字以及下划线,但变量名不能以数字开头,还有变量名不能以gl_作为前缀,这个是GLSL保留的前缀,用于GLSL的内部变量。当然还有一些GLSL保留的名称是不能够作为变量的名称的。
除了布尔型,整型,浮点型基本类型外,GLSL还引入了一些在着色器中经常用到的类型作为基本类型。这些基本类型都可以作为结构体内部的类型。如下表:
跟C语言的void类似,表示空类型。作为函数的返回类型,表示这个函数不返回值。
布尔类型,可以是true 和false,以及可以产生布尔型的表达式。
整型 代表至少包含16位的有符号的整数。可以是十进制的,十六进制的,八进制的。
包含2个布尔成分的向量
包含3个布尔成分的向量
包含4个布尔成分的向量
包含2个整型成分的向量
包含3个整型成分的向量
包含4个整型成分的向量
mat2 或者 mat2x2
2x2的浮点数矩阵类型
mat3或者mat3x3
3x3的浮点数矩阵类型
4x4的浮点矩阵
2列3行的浮点矩阵(OpenGL的矩阵是列主顺序的)
2列4行的浮点矩阵
3列2行的浮点矩阵
3列4行的浮点矩阵
4列2行的浮点矩阵
4列3行的浮点矩阵
用于内建的纹理函数中引用指定的1D纹理的句柄。只可以作为一致变量或者函数参数使用
二维纹理句柄
三维纹理句柄
samplerCube
cube map纹理句柄
sampler1DShadow
一维深度纹理句柄
sampler2DShadow
二维深度纹理句柄
结构体可以组合基本类型和数组来形成用户自定义的类型。在定义一个结构体的同时,你可以定义一个结构体实例。或者后面再定义。
struct&surface&{float&indexOfR
vec3&float&
surface&secondeS
你可以通过=为结构体赋值,或者使用 ==,!=来判断两个结构体是否相等。
mySurface = secondS
mySurface == secondS
只有结构体中的每个成分都相等,那么这两个结构体才是相等的。访问结构体的内部成员使用. 来访问。
vec3 color = mySurface.color + secondSurface.
结构体至少包含一个成员。固定大小的数组也可以被包含在结构体中。GLSL的结构体不支持嵌套定义。只有预先声明的结构体可以嵌套其中。
struct&myStruct&{
&&vec3&points[3];&//固定大小的数组是合法的
&&surface&&&//可以,之前已经定义了
&&struct&velocity&{&&//不合法float&
&&subSurface&&//不合法,没有预先声明;};struct&subSurface&{&&int&
GLSL中只可以使用一维的数组。数组的类型可以是一切基本类型或者结构体。下面的几种数组声明是合法的:
surface&mySurfaces[];
vec4&lightPositions[8];
vec4&lightPos[]&=&lightPconst&int&numSurfaces&=&5;
surface&myFiveSurfaces[numSurfaces];float[5]&
指定显示大小的数组可以作为函数的参数或者使返回值,也可以作为结构体的成员.数组类型内建了一个length()函数,可以返回数组的长度。
lightPositions.length() //返回数组的大小 8
最后,你不能定义数组的数组。
变量的声明可以使用如下的修饰符。
常量值必须在声明是初始化。它是只读的不可修改的。
表示只读的顶点数据,只用在顶点着色器中。数据来自当前的顶点状态或者顶点数组。它必须是全局范围声明的,不能再函数内部。一个attribute可以是浮点数类型的标量,向量,或者矩阵。不可以是数组或则结构体
一致变量。在着色器执行期间一致变量的值是不变的。与const常量不同的是,这个值在编译时期是未知的是由着色器外部初始化的。一致变量在顶点着色器和片段着色器之间是共享的。它也只能在全局范围进行声明。
顶点着色器的输出。例如颜色或者纹理坐标,(插值后的数据)作为片段着色器的只读输入数据。必须是全局范围声明的全局变量。可以是浮点数类型的标量,向量,矩阵。不能是数组或者结构体。
centorid varying
在没有多重采样的情况下,与varying是一样的意思。在多重采样时,centorid varying在光栅化的图形内部进行求值而不是在片段中心的固定位置求值。
(不变量)用于表示顶点着色器的输出和任何匹配片段着色器的输入,在不同的着色器中计算产生的值必须是一致的。所有的数据流和控制流,写入一个invariant变量的是一致的。编译器为了保证结果是完全一致的,需要放弃那些可能会导致不一致值的潜在的优化。除非必要,不要使用这个修饰符。在多通道渲染中避免z-fighting可能会使用到。
用在函数的参数中,表示这个参数是输入的,在函数中改变这个值,并不会影响对调用的函数产生副作用。(相当于C语言的传值),这个是函数参数默认的修饰符
用在函数的参数中,表示该参数是输出参数,值是会改变的。
用在函数的参数,表示这个参数即是输入参数也是输出参数。
内置变量可以与固定函数功能进行交互。在使用前不需要声明。顶点着色器可用的内置变量如下表:
输入属性-表示顶点的主颜色
gl_SecondaryColor
输入属性-表示顶点的辅助颜色
输入属性-表示顶点的法线值
输入属性-表示物体空间的顶点位置
gl_MultiTexCoordn
输入属性-表示顶点的第n个纹理的坐标
gl_FogCoord
输入属性-表示顶点的雾坐标
gl_Position
输出属性-变换后的顶点的位置,用于后面的固定的裁剪等操作。所有的顶点着色器都必须写这个值。
gl_ClipVertex
输出坐标,用于用户裁剪平面的裁剪
gl_PointSize
gl_FrontColor
正面的主颜色的varying输出
gl_BackColor
背面主颜色的varying输出
gl_FrontSecondaryColor
正面的辅助颜色的varying输出
gl_BackSecondaryColor
背面的辅助颜色的varying输出
gl_TexCoord[]
纹理坐标的数组varying输出
gl_FogFragCoord
雾坐标的varying输出
片段着色器的内置变量如下表:
包含主颜色的插值只读输入
gl_SecondaryColor
包含辅助颜色的插值只读输入
gl_TexCoord[]
包含纹理坐标数组的插值只读输入
gl_FogFragCoord
包含雾坐标的插值只读输入
gl_FragCoord
只读输入,窗口的x,y,z和1/w
gl_FrontFacing
只读输入,如果是窗口正面图元的一部分,则这个值为true
gl_PointCoord
点精灵的二维空间坐标范围在(0.0, 0.0)到(1.0, 1.0)之间,仅用于点图元和点精灵开启的情况下。
gl_FragData[]
使用glDrawBuffers输出的数据数组。不能与gl_FragColor结合使用。
gl_FragColor
输出的颜色用于随后的像素操作
gl_FragDepth
输出的深度用于随后的像素操作,如果这个值没有被写,则使用固定功能管线的深度值代替
GLSL语言的操作符与C语言相似。如下表(操作符的优先级从高到低排列)
用于表达式组合,函数调用,构造
数组下标,向量或矩阵的选择器
结构体和向量的成员选择
++ --
前缀或后缀的自增自减操作符
+ – !
一元操作符,表示正 负 逻辑非
乘 除操作符
二元操作符 表示加 减操作
&& &= &= == !=
小于,大于,小于等于, 大于等于,等于,不等于 判断符
逻辑与 ,或,& 异或
条件判断符
= += –= *=& /=
赋值操作符
像 求地址的& 和 解引用的 * 操作符不再GLSL中出现,因为GLSL不能直接操作地址。类型转换操作也是不允许的。 位操作符(&,|,^,~, &&, && ,&=, |=, ^=, &&=, &&=)是GLSL保留的操作符,将来可能会被使用。还有求模操作(%,%=)也是保留的。
数组的下标从0开始。合理的范围是[0, size - 1]。跟C语言一样。如果数组访问越界了,那行为是未定义的。如果着色器的编译器在编译时知道数组访问越界了,就会提示编译失败。
vec4 myColor, ambient, diffuse[6], specular[6];
myColor = ambient + diffuse[4] + specular[4];
构造函数可以用于初始化包含多个成员的变量,包括数组和结构体。构造函数也可以用在表达式中。调用方式如下:
vec3 myNormal = vec3(1.0, 1.0, 1.0);
greenTint = myColor + vec3(0.0, 1.0, 0.0);
ivec4 myColor = ivec4(255);
还可以使用混合标量和向量的方式来构造,只要你的元素足以填满该向量。
vec4 color = vec4(1.0, vec2(0.0, 1.0), 1.0);
vec3 v = vec3(1.0, 10.0, 1.0);
vec3 v1 = vec3(v);
vec2 fv = vec2(5.0, 6.0);
float f = float(fv);&
对于矩阵,OpenGL中矩阵是列主顺序的。如果只传了一个值,则会构造成对角矩阵,其余的元素为0.
mat3 m3 = mat3(1.0);
构造出来的矩阵式:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
mat2 matrix1 = mat2(1.0, 0.0, 0.0, 1.0);
mat2 matrix2 = mat2(vec2(1.0, 0.0), vec2(0.0, 1.0));
mat2 matrix3 = mat2(1.0);&
mat2 matrix4 = mat2(mat4(2.0));&&4x4矩阵左上角的2x2矩阵。
构造函数可以用于标量数据类型的转换。GLSL不支持隐式或显示的转换,只能通过构造函数来转。其中int转为float值是一样的。float转为int则小数部分被丢弃。int或float转为bool,0和0.0转为false,其余的值转为true. bool转为int或float,false值转为0和0.0,true转为1和1.0.
float f = 1.7;
int I = int(f); // I = 1
数组的初始化,可以在构造函数中传入值来初始化数组中对应的每一个值。
ivec2 position[3] = ivec2[3]((0,0), (1,1), (2,2));
ivec2 pos2[3] = ivec2[]((3,3), (2,1), (3,1));
构造函数也可以对结构体进行初始化。其中顺序和类型要一一对应。
struct&surface&{&&int&&
&&vec3&&&float&
surface&mySurface&=&surface(3,&vec3(red,&green,&blue),&0.5);
向量中单独的成分可以通过{x,y,z,w},{r,g,b,a}或者{s,t,p,q}的记法来表示。这些不同的记法用于顶点,颜色,纹理坐标。在成分选择中,你不可以混合使用这些记法。其中{s,t,p,q}中的p替换了纹理的r坐标,因为与颜色r重复了。下面是用法举例:
vec3&myVec&=&{0.5,&0.35,&0.7};float&r&=&myVec.r;float&myYz&=&myVec.float&myQ&=&myVec.q;//出错,数组越界访问,q代表第四个元素float&myRY&=&myVec.&//不合法,混合使用记法
较特殊的使用方式,你可以重复向量中的元素,或者颠倒其顺序。如:
vec3&yxz&=&myVec.&//调换顺序vec4&mySSTT&=&myVec.&//重复其中的值
在赋值是,也可以选择你想要的顺序,但是不能重复其中的成分。
vec4&myColor&=&{0.0,&1.0,&2.0,&1.0};
myColor.x&=&-1.0;
myColor.yz&=&vec2(3.0,&5.0);
myColor.wx&=&vec2(1.0,&3.0);
myColor.zz&=&vec2(2.0,&3.0);&//不合法
我们也可以通过使用下标来访问向量或矩阵中的元素。如果越界那行为将是未定义的。
float myY = myVec[1];
在矩阵中,可以通过一维的下标来获得该列的向量(OpenGL的矩阵是列主顺序的)。二维的小标来获得向量中的元素。
mat3&myMat&=&mat3(1.0);
vec3&myVec&=&myMat[0];&//获得第一列向量&1.0,&0.0,&0.0float&f&=&myMat[0][0];&//&第一列的第一个向量。
与C和C++相似,GLSL语言也提供了for, while, do/while的循环方式。使用continue跳入下一次循环,break结束循环。
for&(l&=&0;&l&&&numL&l++)
{if&(!lightExists[l])
&&&&color&+=&light[l];
}while&(i&&&num)
&&&&sum&+=&color[i];
&&&&i++;
&&&&color&+=&light[lightNum];
&&&&lightNum--;
}while&(lightNum&&&0)
color&=&unlitCif&(numLights&&&0)
&&&&color&=&litC
&&&&color&=&unlitC
片段着色器中有一种特殊的控制流成为discard。使用discard会退出片段着色器,不执行后面的片段着色操作。片段也不会写入帧缓冲区。
在每个shader中必须有一个main函数。main函数中的void参数是可选的,但返回值是void时必须的。
void&main(void)
GLSL中的函数,必须是在全局范围定义和声明的。不能在函数定义中声明或定义函数。函数必须有返回类型,参数是可选的。参数的修饰符(in, out, inout, const等)是可选的。
//函数声明
bool&isAnyNegative(const&vec4&v);
//函数调用void&main(void)
bool&isNegative&=&isAnyNegative(gl_Color);
bool&isAnyNegative(const&vec4&v)
if&(v.x&&&0.0&||&v.y&&&0.0&||&v.z&&&0.0&||&v.w&&&0.0)
结构体和数组也可以作为函数的参数。如果是数组作为函数的参数,则必须制定其大小。在调用传参时,只传数组名就可以了。
vec4&sumVectors(int&sumSize,&vec4&v[10]);void&main()
&&&&vec4&myColors[10];
&&&&vec4&sumColor&=&sumVectors(5,&myColors);
vec4&sumVectors(int&sumSize,&vec4&v[10])
int&i&=&0;
&&&&vec4&sum&=&vec4(0.0);
for(;&i&&&sumS&++i)
&&&&&&&&sum&+=&v[i];&
GLSL的函数是支持重载的。函数可以同名但其参数类型或者参数个数不同即可。
float&sum(float&a,&float&b)
return&a&+&b;
vec3&sum(vec3&v1,&vec3&v2)
return&v1&+&v2;
GLSL中函数递归是不被允许的。其行为是未定义的。
GLSL中提供了许多内建的函数,来方便我们的使用。可以在官方手册中查找相关的函数
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:84809次
积分:1600
积分:1600
排名:千里之外
原创:64篇
转载:39篇
评论:52条
文章:38篇
阅读:24791
(3)(4)(13)(12)(4)(7)(4)(14)(1)(4)(2)(1)(3)(2)(1)(1)(2)(5)(5)(3)(7)(4)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'OSG与GLSL结合之默认内置变量 - bestHulk的博客 - CSDN博客
OSG与GLSL结合之默认内置变量
OSG中内置的一致变量,在自己的程序中定义这些变量之后,OSG系统将自动负责每帧对其进行更新,以方便着色器对应用程序信息的获取。
具体的类型和命名如下所示:
uniform int osg_FrameNumber:当前OSG程序运行的帧数;
uniform float osg_FrameTime:当前OSG程序的运行总时间;
uniform float osg_DeltaFrameTime:当前OSG程序运行每帧的间隔时间;
uniform mat4 osg_ViewMatrix:当前OSG摄像机的观察矩阵;
uniform mat4 osg_ViewMatrixInverse:当前OSG摄像机观察矩阵的逆矩阵。
uniform mat4 osg_ModelViewMatrix:内置gl_ModelViewMatrix
uniform mat4 osg_ModelViewProjectionMatrix:内置gl_ModelViewProjectionMatrix
uniform mat4 osg_ProjectionMatrix:内置gl_ProjectionMatrix
uniform mat3 osg_NormalMatrix:内置gl_NormalMatrix
OSG提供了完整的GLSL着色语言的功能封装,其主要实现者包括osg命名空间中的以下几个类:
Program类:
它属于StateAttribute的一个派生对象,可以被设置到一个节点或者一个可绘制物体(Drawable)上,从而将着色器绑定到指定的场景对象,这相当于对OpenGL函数glProgram的一个实现接口。
Program可以使用addShader()和removeShader()方法追加或删除着色器对象,使用setParameter()方法设置着色器参数,使用addBindAttribLocation()绑定顶点属性信息到着色器的属性变量,以及使用addBindFragDataLocation()绑定片元着色器输出数据到FBO。
Shader类:
这个类封装了顶点着色器,片元着色器和几何着色器的代码加载和编译功能,相当于OpenGL函数glShaderSource和glCompileShader的实现接口。
Uniform类:
着色器一致变量的接口类。对于OpenGL着色语言而言,一致变量(uniform)是用户应用程序与着色器的主要交互接口。Uniform类支持绑定多种类型的一致变量,并使用set()和setArray()更新变量或变量数组的值。而为了实现一致变量的每帧变化,进而达到顶点和片元的各种动画特效,Uniform类还提供了相应的回调工具:使用setUpdateCallback设置自定义的回调类,并在其中更新这个一致变量的值,以实现所需的效果。
着色器一致变量的接口类。对于OpenGL着色语言而言,一致变量(uniform)是用户应用程序与着色器的主要交互接口。Uniform类支持绑定多种类型的一致变量,并使用set()和setArray()更新变量或变量数组的值。而为了实现一致变量的每帧变化,进而达到顶点和片元的各种动画特效,Uniform类还提供了相应的回调工具:使用setUpdateCallback设置自定义的回调类,并在其中更新这个一致变量的值,以实现所需的效果。
我的热门文章

我要回帖

更多关于 glsl 统一变量 的文章

 

随机推荐