AivanF. Asked:2020-01-04 19:53:45 +0000 UTC2020-01-04 19:53:45 +0000 UTC 2020-01-04 19:53:45 +0000 UTC GLSL:输入/输出/变化/属性/统一关键字 772 varying许多着色器有/关键字attribute,有些使用 in/ out,但它们没有一对一的关系。如何使用它们?这是什么意思uniform?哪些是关于身体数据的,哪些是关于顶点的,哪些是关于单个像素的? c 1 个回答 Voted Best Answer AivanF. 2020-01-04T19:53:45Z2020-01-04T19:53:45Z 所描述的关键字是变量修饰符。它们具有以下含义: const- 表示在着色器执行期间其值不会改变并且在编译时已知的常量变量。它们对着色器处理的所有图元都是通用的。 uniform- 表示常量变量,其值在着色器执行期间不会改变,但在编译时未知,可以在每次调用着色器程序之前通过 OpenGL API 设置。也就是说,它描述了整个处理后的原语共有的数据。 attribute– 分别用每个顶点的数据描述变量。 varying- 用于在片段和顶点着色器之间传递插值。它们在顶点着色器中是可写的,在片段着色器中是只读的。 varying/attribute和in/修饰符out用于一个目的:在着色器程序的不同阶段之间传输数据。因此,它们可以定义如下: in- 将数据引用到上一阶段的着色器 out- 将着色器中的数据引用到下一个阶段 attribute- 与in顶点着色器相同 varying- 与out顶点着色器中相同,in与片段着色器中相同 最后两个被认为已弃用:默认情况下,它们在 4.2 核心配置文件中不受支持,仅在兼容模式下。 传统顶点着色器的示例: #version 110 attribute vec2 position; varying vec2 texcoord; void main() { gl_Position = vec4(position, 0.0, 1.0); texcoord = position * vec2(0.5) + vec2(0.5); } 及其更新版本: #version 420 in vec2 position; out vec2 texcoord; void main() { gl_Position = vec4(position, 0.0, 1.0); texcoord = position * vec2(0.5) + vec2(0.5); } 有用的,使用过的链接: OpenGL Wiki:类型修饰符 GameDev:GLSL 中的输入/输出关键字 enSO:属性、统一和可变变量之间的差异
所描述的关键字是变量修饰符。它们具有以下含义:
const- 表示在着色器执行期间其值不会改变并且在编译时已知的常量变量。它们对着色器处理的所有图元都是通用的。uniform- 表示常量变量,其值在着色器执行期间不会改变,但在编译时未知,可以在每次调用着色器程序之前通过 OpenGL API 设置。也就是说,它描述了整个处理后的原语共有的数据。attribute– 分别用每个顶点的数据描述变量。varying- 用于在片段和顶点着色器之间传递插值。它们在顶点着色器中是可写的,在片段着色器中是只读的。varying/attribute和in/修饰符out用于一个目的:在着色器程序的不同阶段之间传输数据。因此,它们可以定义如下:in- 将数据引用到上一阶段的着色器out- 将着色器中的数据引用到下一个阶段attribute- 与in顶点着色器相同varying- 与out顶点着色器中相同,in与片段着色器中相同最后两个被认为已弃用:默认情况下,它们在 4.2 核心配置文件中不受支持,仅在兼容模式下。
传统顶点着色器的示例:
及其更新版本:
有用的,使用过的链接:
OpenGL Wiki:类型修饰符
GameDev:GLSL 中的输入/输出关键字
enSO:属性、统一和可变变量之间的差异