GLSL 三种变量类型(uniform,attribute和varying)理解 - 简书
文章推薦指數: 80 %
1.uniform变量uniform变量是外部程序传递给(vertex和fragment)shader的变量。
因此它是application通过函数glUniform**(...
GLSL三种变量类型(uniform,attribute和varying)理解1.uniform变量uniform变量是外部程序传递给(vertex和fragment)shader的变量。
因此它是application通过函数glUniform**()函数赋值的。
在(vertex和fragment)shader程序内部,uniform变量就像是C语言里面的常量(const),它不能被shader程序修改。
(shader只能用,不能改)如果uniform变量在vertex和fragment两者之间声明方式完全一样,则它可以在vertex和fragment共享使用。
(相当于一个被vertex和fragmentshader共享的全局变量)uniform变量一般用来表示:变换矩阵,材质,光照参数和颜色等信息。
以下是例子:uniformmat4viewProjMatrix;//投影+视图矩阵uniformmat4viewMatrix; //视图矩阵uniformvec3lightPosition; //光源位置uniformfloatlumaThreshold;uniformfloatchromaThreshold;uniformsampler2DSamplerY;uniformsampler2DSamplerUV;uniformmat3colorConversionMatrix;2.attribute变量attribute变量是只能在vertexshader中使用的变量。
(它不能在fragmentshader中声明attribute变量,也不能被fragmentshader中使用)一般用attribute变量来表示一些顶点的数据,如:顶点坐标,法线,纹理坐标,顶点颜色等。
在application中,一般用函数glBindAttribLocation()来绑定每个attribute变量的位置,然后用函数glVertexAttribPointer()为每个attribute变量赋值。
以下是例子:attributevec4position;attributevec2texCoord;uniformfloatpreferredRotation;varyingvec2texCoordVarying;voidmain(){mat4rotationMatrix=mat4(cos(preferredRotation),-sin(preferredRotation),0.0,0.0,sin(preferredRotation), cos(preferredRotation),0.0,0.0,0.0, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0);gl_Position=position*rotationMatrix;texCoordVarying=texCoord;}3.varying变量varying变量是vertex和fragmentshader之间做数据传递用的。
一般vertexshader修改varying变量的值,然后fragmentshader使用该varying变量的值。
因此varying变量在vertex和fragmentshader二者之间的声明必须是一致的。
application不能使用此变量。
以下是例子://Vertexshader attributevec4position;attributevec2texCoord;uniformfloatpreferredRotation;varyingvec2texCoordVarying; //Varyinginvertexshadervoidmain(){mat4rotationMatrix=mat4(cos(preferredRotation),-sin(preferredRotation),0.0,0.0,sin(preferredRotation), cos(preferredRotation),0.0,0.0,0.0, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0);gl_Position=position*rotationMatrix;texCoordVarying=texCoord;}//Fragmentshadervaryinghighpvec2texCoordVarying; //Varyinginfragmentshaderprecisionmediumpfloat;uniformfloatlumaThreshold;uniformfloatchromaThreshold;uniformsampler2DSamplerY;uniformsampler2DSamplerUV;uniformmat3colorConversionMatrix;voidmain(){mediumpvec3yuv;lowpvec3rgb;//Subtractconstantstomapthevideorangestartat0yuv.x=(texture2D(SamplerY,texCoordVarying).r-(16.0/255.0))*lumaThreshold;yuv.yz=(texture2D(SamplerUV,texCoordVarying).rg-vec2(0.5,0.5))*chromaThreshold;rgb=colorConversionMatrix*yuv;gl_FragColor=vec4(rgb,1);}推荐阅读更多精彩内容OpenGLES2.0的三种变量类型(uniform,attribute和varying)最近研究了下OpenGLES2.0的programingguide。
看到shader里面声明的变量一般有三种类...狼之独步阅读988评论0赞0OpenGL一些基本理解和概念的学习OpenGL学习大致的理解OpenGL为什么会涉及这么多操作顺序。
这是因为,和我们现在使用的C++、JAVA这种...wo不懂阅读4,292评论10赞8学习WebGL之深入了解Shader本系列所有文章目录本文将带大家深入了解Shader,下面是运行截图,可以前往我的博客查看代码演示。
前言上篇文...handyTOOL阅读9,841评论2赞7OpenGLES2.0(iOS)[01]:一步从一个小三角开始目录结构:第一步,明确要干嘛第二步,怎么去画(纯理论)第三步,怎么去画(实战)第四步,练练手第一步,明确...半纸渊阅读7,291评论18赞58OpengGLES基础入门----(3)着色器的介绍着色器(Shader)是运行在GPU上的小程序。
这些小程序为图形渲染管线的某个特定部分而运行。
从基本意义上来说,着...RM_乾笙阅读921评论0赞02017-11-23一直觉得感恩不需要拘泥于哪一天,而是在生活的时时刻刻,所以,真心没把今天当作一个特别的节日!而大家都在今天如火如荼...happyMia阅读107评论0赞0阅读是座桥,架起桥梁为孩子健康成长护航。
今天是个值得书写的日子,因为我们班组织了一次户外亲子共读活动。
从开始策划活动,选择活动主题、写活动邀请函、寻找合...彩凤知音阅读190评论1赞3证婚词徐行20160817各位来宾、各位朋友们中午好!今天,是李磊先生和于爽小姐喜结良缘的大好日子。
首先感谢一对...徐行我看行阅读220评论0赞0抽奖14赞15赞赞赏更多好文
延伸文章資訊
- 1uniforms - The Book of Shaders
These inputs are called uniform and come in most of the supported types: float ... In the same wa...
- 2Advanced GLSL - LearnOpenGL
OpenGL gives us a tool called uniform buffer objects that allow us to declare a set of global uni...
- 3Uniform (GLSL) - OpenGL Wiki - Khronos Group
Uniform (GLSL) ... Shader stages: ... A uniform is a global Shader variable declared with the "un...
- 4GLSL 三种变量类型(uniform,attribute和varying)理解 - 简书
1.uniform变量uniform变量是外部程序传递给(vertex和fragment)shader的变量。因此它是application通过函数glUniform**(...
- 5高级GLSL
Uniform块布局