在GLSL着色器中使用输入/输出结构

0xb*_*00d 3 opengl glsl hlsl2glsl

在HLSL中,我可以写:

struct vertex_in
{
    float3 pos    : POSITION;
    float3 normal : NORMAL;
    float2 tex    : TEXCOORD;
};
Run Code Online (Sandbox Code Playgroud)

并将此结构用作顶点着色器的输入:

vertex_out VS(vertex_in v) { ... }
Run Code Online (Sandbox Code Playgroud)

GLSL中有类似的东西吗?还是我需要写一些类似的东西:

layout(location = 0) in vec4 aPosition;
layout(location = 1) in vec4 aNormal;
...
Run Code Online (Sandbox Code Playgroud)

And*_*man 5

您正在寻找的东西在GLSL 中被称为接口块

不幸的是,它们不支持Vertex Shader阶段的输入或Fragment Shader阶段的输出。这些在程序链接时必须具有显式绑定的数据位置(否则它们将被自动分配,您以后可以查询它们)。

关于使用HLSL语义一样的: POSITION: NORMAL: TEXCOORD现代 GLSL没有这样的事情。将顶点属性通过名称绑定到通用(编号)位置,方法是使用glBindAttribLocation (...)链接之前,或如您的示例所示layout (location = ...)

对于着色器阶段之间的输入/输出,在GLSL程序链接期间,这完全基于变量/接口块名称进行匹配(除非使用相对较新的“ 单独的着色器对象”扩展名)。在任何情况下,你将有恒定的预先定义的命名语义一样POSITIONNORMAL等虽; 位置都是应用程序或链接程序定义的数字。