麻烦了解Vulkan Shader

时间:2017-11-08 23:57:48

标签: glsl vulkan

来自Vulkan Tutorial

#version 450
#extension GL_ARB_separate_shader_objects : enable

out gl_PerVertex {
    vec4 gl_Position;
};

vec2 positions[3] = vec2[](
    vec2(0.0, -0.5),
    vec2(0.5, 0.5),
    vec2(-0.5, 0.5)
);

void main() {
    gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0);
}

问题1:这指定了什么?

out gl_PerVertex {
    vec4 gl_Position;
};

问题2:语法vec2 positions[3] = vec2[](...)的解释是什么?要初始化数组,不应该是语法

vec2 positions[3] = {
    vec2(0.0, -0.5),
    vec2(0.5, 0.5),
    vec2(-0.5, 0.5)
};

这是特定于着色器的语法,还是arrayType[](...)可以在C ++中用作构造函数?

1 个答案:

答案 0 :(得分:1)

  

问题1 :这指定了什么?

<!DOCTYPE html>
<html>
<body>

<embed src="http://example.com/game.swf" width="800" height="600">

</body>
</html>

Output Interface Block。 (进一步查看GLSL Specification - 4.3.9 Interface Blocks


  

问题2 :什么解释了语法vec2位置3 = vec2?要初始化数组,语法不应该是......

没有


Array constructors

  

可以使用数组构造函数语法构造数组。在这种情况下,   type还包含[]数组表示法:

out gl_PerVertex {
    vec4 gl_Position;
};


GLSL Specification - 4.1.11 Initializers

  

如果初始值设定项是用大括号括起来的初始值设定项列表,则声明的变量必须是a   向量,矩阵,数组或结构。

const float array[3] = float[3](2.5, 7.0, 1.5);
     

...

     

以下所有声明都会导致编译时错误。

int i = { 1 }; // illegal, i is not a composite 
     

...

     

如果为未大小的数组提供了初始化程序(任何一种形式),则数组的大小由   初始化程序中的顶级(非嵌套)初始值设定项的数量。所有以下声明都会创建   数组显式大小为五个元素:

float a[2] = { 3.4, 4.2, 5.0 }; // illegal