glsl中uniform,attribute和varying详解

网友投稿 257 2022-09-23

glsl中uniform,attribute和varying详解

openGL系列文章目录

文章目录

​​openGL系列文章目录​​​​uniform​​​​attribute​​​​varying​​​​参考​​

uniform

uniform mat4 mv_matrix;uniform mat4 proj_matrix;

关键字“mat4”表示这些是4×4 矩阵。这里我们将用来保存模型-视图矩阵的变量命名为mv_matrix,并将用来保存投影矩阵的变量命名为proj_matrix。因为3D 变换是4×4 的,因此mat4 是GLSL 着色器统一中常用的数据类型。将数据从C++/OpenGL 应用程序发送到统一变量需要执行以下步骤:(a)获取统一变量的引用;(b)将指向所需数值的指针与获取的统一引用相关联。 假设链接的渲染程序保存在名为“renderingProgram”的变量中,以下代码行表示,我们要把模型-视图和投影矩阵发送到两个统一变量mv_matrix 和proj_matrix 中去:

mvLoc = glGetUniformLocation(renderingProgram,"mv_matrix"); // 获取着色器程序中统一变量的位置projLoc = glGetUniformLocation(renderingProgram,"proj_matrix");glUniformMatrix4fv(mvLoc, 1, GL_FALSE, glm::value_ptr(mvMat)); // 将矩阵数据发送到统一变量中glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(pMat));

attribute

out vec4 color;

gl_Position = proj_matrix * mv_matrix * position;

然后,变换后的顶点将自动输出到光栅着色器,最终将相应的像素位置发送到片段着色器。

varying

varying变量主要用于在Shader Stage间进行传递,注意的是在光栅化(Rasterization)的时候,这些变量也会跟着一起被光栅插值。那如果我们不想某个顶点属性被光栅化,该怎么办呢?在[OpenGL常用命令备忘录(Part A)]这篇文章提到的一个古老API,glShadeModel,它在固定管道渲染流水线上能起到控制图元属性是否被插值的功效(需要光栅化时传入参数GL_SMOOTH,不需要时传入GL_FLAT),那么当选择不插值时(GL_FLAT),流水线上发生了什么呢?

假设现在流水线上,经过裁剪、归一化等,生成了一个屏幕上的三角图元(三个顶点上的颜色属性分别是c1、c2、c3),进入光栅化阶段。假如进行插值,三角图元里各像(假设共n个)素会根据其各自位置对三个顶点的颜色值进行线性插值,生成对应的n个颜色值(cList[n]);假如不插值,则该三角形里所有像素都会是同一个值(cConst),这个值可能等于c1、c2或c3其中一个。到底是哪一个呢?这取决于哪个顶点是provoking-vertex(在[乱弹纪录I:Geometry Shader] 中也提及过它)。你可以在OpenGL端通过glProvokingVertex函数改变这个设置(参数GL_FIRST_VERTEX_CONVENTION/GL_LAST_VERTEX_CONVENTION决定取图元绘制顺序的第一个顶点还是最后一个顶点作为provoking-vertex)。

attribute vec4 vPosition;varying vec4 color;void main() { color= vec4(1,0,0,1); gl_Position = vPosition;}

#version 430layout (location = 0) in vec3 vertPos;layout (location = 1) in vec3 vertNormal;out vec3 varyingNormal;out vec3 varyingLightDir;out vec3 varyingVertPos;struct PositionalLight{ vec4 ambient; vec4 diffuse; vec4 specular; vec3 position;};struct Material{ vec4 ambient; vec4 diffuse; vec4 specular; float shininess;};uniform vec4 globalAmbient;uniform PositionalLight light;uniform Material material;uniform mat4 mv_matrix;uniform mat4 proj_matrix;uniform mat4 norm_matrix;void main(void){ varyingVertPos = (mv_matrix * vec4(vertPos,1.0)).xyz; varyingLightDir = light.position - varyingVertPos; varyingNormal = (norm_matrix * vec4(vertNormal,1.0)).xyz; gl_Position = proj_matrix * mv_matrix * vec4(vertPos,1.0);}

参考

计算机图形学编程 使用OpenGL和C++

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:万能的大熊:从剁手到种草,从花钱到赚钱,这个双11和往年不一样!
下一篇:着色器语言第三版笔记(第二章)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~