我是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;
...
答案 0 :(得分:5)
您正在寻找的内容在GLSL中被称为interface blocks。
不幸的是,它们不支持顶点着色器阶段的输入或片段着色器阶段的输出。那些必须在程序链接时明确绑定数据位置(或者它们将被自动分配,您可以稍后查询它们。)
关于HLSL语义的使用,例如: POSITION
,: NORMAL
,: TEXCOORD
,现代 GLSL没有类似的东西。在链接之前使用glBindAttribLocation (...)
或在示例layout (location = ...)
中使用POSITION
,顶点属性按名称绑定到通用(编号)位置。
对于着色器阶段之间的输入/输出,在GLSL程序链接期间完全基于变量/接口块名称匹配(除非您使用相对较新的Separate Shader Objects扩展名) 。在任何情况下,您都不会有NORMAL
,{{1}}等常量预定义的命名语义;位置都是应用程序或链接器定义的数字。