3

在 HLSL 中,我可以写:

struct vertex_in
{
    float3 pos    : POSITION;
    float3 normal : NORMAL;
    float2 tex    : TEXCOORD;
};

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

vertex_out VS(vertex_in v) { ... }

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

layout(location = 0) in vec4 aPosition;
layout(location = 1) in vec4 aNormal;
...
4

1 回答 1

6

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

不幸的是,它们不支持顶点着色器阶段的输入或片段着色器阶段的输出。这些必须在程序链接时明确绑定数据位置(或者它们将被自动分配,您可以稍后查询它们)。

关于 , , 等 HLSL 语义的使用,现代: POSITIONGLSL没有这样的东西。顶点属性通过名称绑定到通用(编号)位置,或者在链接之前使用,或者在您的示例中使用.: NORMAL: TEXCOORDglBindAttribLocation (...)layout (location = ...)

对于着色器阶段之间的输入/输出,在 GLSL 程序链接期间完全根据变量/接口块名称进行匹配(除非您使用相对较新的分离着色器对象扩展)。但是,在任何情况下,您都不会拥有恒定的预定义命名语义,例如POSITION,NORMAL等;位置都是应用程序或链接器定义的数字。

于 2014-04-12T21:58:50.763 回答