GLSL中的in /​​ out关键字


46

我不太了解如何在GLSL中使用in/ out关键字,并且google在特性上毫无帮助。

他们到底是做什么的?例如,如果要将每个顶点的变化变量集传递给片段着色器,我将如何使用它们?

从字面上看,我发现每个教程都使用varying/ attribute关键字,但这没有帮助。

Answers:


65

存储预选赛inout实际上有包含并取代了的目的varyingattribute。它们定义了着色器分别在输入输出中使用的变量。请参阅GLSL 4.2参考卡第7页:

  • in:从上一阶段链接到着色器
  • out:从着色器链接到下一阶段
  • attribute:与in顶点着色器相同
  • varying:与out顶点着色器相同,in与片段着色器相同(注意:在上述参考卡中这些错误地翻转了。)

附带说明一下,后两者已过时:它们不在4.2核心配置文件中,仅在兼容性配置文件中。


他们到底是做什么的?

至于用法,请将顶点着色器从入门介绍到现代OpenGL。第2.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);
}

应该在4.2核心中将其重写为:

#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);
}

无用的教程

我猜您发现“过时的”教程代码的主要原因是,并不是每个人都可以使用GLSL 3.3+兼容的硬件。无论如何,对于一个很好且最新的教程,我很乐意为您指明Nicol Bolas的“ 学习现代3D图形编程的方向。


2
@NicolBolas哈!我已经知道有一些可疑之处。那是那张参考卡的错误。谢谢!:-)
Eric
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.