在GLSL-Shaders中使用输入/输出结构

时间:2014-04-12 20:09:15

标签: opengl glsl hlsl2glsl

我是GLSL的新手。在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;
...

1 个答案:

答案 0 :(得分:5)

您正在寻找的内容在GLSL中被称为interface blocks

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

关于HLSL语义的使用,例如: POSITION: NORMAL: TEXCOORD现代 GLSL没有类似的东西。在链接之前使用glBindAttribLocation (...)或在示例layout (location = ...)中使用POSITION,顶点属性按名称绑定到通用(编号)位置。

对于着色器阶段之间的输入/输出,在GLSL程序链接期间完全基于变量/接口块名称匹配(除非您使用相对较新的Separate Shader Objects扩展名) 。在任何情况下,您都不会有NORMAL,{{1}}等常量预定义的命名语义;位置都是应用程序或链接器定义的数字。