- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
GLSL教程
GLSL教程
GLSL语言采用类似C语言的词法和语法格式,并使用专门的编译系统,因而非常利于开发者移植和实现自己的特效效果。
最新的OpenGL标准中定义了三个可编程图形处理器,即“顶点着色器”(Vertex Shader),“片元着色器”(Fragment
Shader)和“几何着色器”(Geometry Shader)。这与HLSL,Cg等主流着色语言的设置大同小异。
顶点着色器可以用于替代顶点和法线变换、纹理坐标生成和变换、光照以及材质应用这些传统的管线命令;片元着色器则
用于替代纹理应用、雾化和像素汇总的工作;几何着色器则可以在图元装配的过程中重新生成新的图元。
各个着色器的语法格式十分类似,因此不必单独加以学习。GLSL中可用的数据类型通常包括:标量类型(float,int,bo
ol),矢量类型(vec2,vec3,vec4等),矩阵(mat2,mat3,mat4等),纹理取样器(sampler1D,sampler2D,sample
r3D,samplerCube等),以及结构体,数组和void类型。
矢量的组成部分可以使用“.”操作符后追加x/y/z/w或者r/g/b/a或者s/t/p/q来表示,例如:
vec4 pos;
vec3 pos3 = pos.xyz;
vec2 pos2 = pos.xy;
float x = pos.x;
矩阵的组成部分通过二维数组或者一维数组的形式来表示,例如:
mat4 m;
vec4 col = m[2]; // 矩阵的第3列矢量
float val = m[3][1]; // 矩阵的第4列第2个分量
取样器的值(纹理图像)只能从外部应用程序获得,而且不能被更改,不过可以通过内置函数和作为纹理索引坐标的矢量
参数取出,例如:
uniform sampler2D texture;
varying vec2 coord;
…
vec4 color = texture2D( texture, coord );
GLSL与C语言语法相近的地方包括变量赋值,变量类型转换,变量作用域,操作符,条件分支语句,循环语句,函数以及
预处理表达式等;而矢量的混合(Swizzle)则是GLSL语言所特有的,例如:
vec4 pos = vec4( 1.0, 2.0, 3.0, 4.0 );
vec4 swiz = pos.wxyz; // swiz=vec4( 4.0, 1.0, 2.0, 3.0 )
vec4 dup = pos.xxyy; // dup = vec4( 1.0, 1.0, 2.0, 2.0 )
此外,矢量与矢量之间,矩阵与矩阵之间,矢量与矩阵之间的乘法法则也不同于简单的标量相乘,而是运用线性代数的原
理执行计算
GLSL语言中包括几种限定符,用于修饰函数形式参数或者指定着色器之间以及与外部应用程序的接口,这些接口也是我们
控制可编程图形绘制的重要通道。
attribute:应用程序与顶点着色器的接口,使用顶点属性定义函数进行定义;
uniform:应用程序与所有着色器的接口,定义不随顶点变化的“一致变量”;
varying:着色器之间的“易变变量”接口,用于传递插值得到的顶点数据;
const:用于声明常量数据;
in:作为函数形参进行传递,函数返回时不保留改变,只保留传入值;
out:作为函数形参进行传递,本身未定义,函数返回时保留改变值;
inout:作为函数形参进行传递,可以定义传入值,也会保留返回时的改变值。
这里可以简单地解释一下“顶点属性”的概念。OpenGL中的“顶点”并非仅仅一个简单的坐标值,而是由一系列数据组成的。
其中包括该顶点的位置坐标,法线坐标,颜色坐标,纹理坐标,雾坐标,以及自定义属性的坐标。对于传统的OpenGL开发
者而言,要定义一个顶点的所有信息,往往需要编写形同下面的代码:
glBegin( … );
// One Vertex
glTexCoord( … );
glNormal( … );
glVertexAttrib( … );
glVertex( … );
// Another Vertex
…
glEnd();
其中,glVertexAttrib函数就可以用于设置attribute变量的输入值。显而易见,此类变量的值是逐顶点(per-vertex)
变化的,每个输入顶点的属性都不相同。
易变变量varying的意义与顶点属性变量attribute类似,其值也是逐顶点变化的,并且将顶点插值得到的结果从顶点着色
器传入几何/片元着色器。
而一致变量uniform的特点则是取值不随顶点变化,对于参与着色器运算的所有的顶点而言,它都是“一致的”。
要深入理解attribute,uniform和varying变量的
文档评论(0)