2017-11-08 3 views
1

Vom Vulkan Tutorial Legendes:Ärger Vulkan Shader

#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); 
} 

Frage 1: Was ist bezeichnen das?

out gl_PerVertex { 
    vec4 gl_Position; 
}; 

Frage 2: Was die Syntax vec2 positions[3] = vec2[](...) erklärt? Um das Array zu initialisieren, sollte nicht die Syntax seine

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

Ist die Shader-spezifische Syntax oder arrayType[](...) kann als constructer in C++ verwendet werden?

Antwort

1

Frage 1: Was bedeutet das?

Diese

out gl_PerVertex { 
    vec4 gl_Position; 
}; 

ist ein Output Interface Block. (Sehen Sie weitere GLSL Specification - 4.3.9 Interface Blocks)


Frage 2: Was die Syntax erklärt vec2 3 = vec2 positioniert? Um das Array zu initialisieren, sollte nicht die Syntax sein ...

Nr


Siehe Array constructors

Arrays aufgebaut werden kann Array Konstruktor Syntax. In diesem Fall enthält der Typ auch die [] Array-Notation:

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


Siehe GLSL Specification - 4.1.11 Initializers:

Wenn ein initializer eine Liste von Initialisierungen in geschweiften Klammern, die Variable eingeschlossen ist deklariert werden muss ein Vektor, eine Matrix, ein Array oder eine Struktur sein.

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

....

Alle folgenden Erklärungen führen zu einem Fehler bei der Kompilierung.

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

....

Wenn ein Initialisierer (von jeder Form) für ein ungeleimtes Array vorgesehen ist, die Größe des Arrays wird durch die Anzahl von Top-Level (non-nested) bestimmt Initialisierer innerhalb des Initialisierers.Alle folgenden Erklärungen erstellen Arrays explizit mit fünf Elementen Größe:

float a[] = float[](3.4, 4.2, 5.0, 5.2, 1.1); 
float b[] = { 3.4, 4.2, 5.0, 5.2, 1.1 }; 
float c[] = a; // c is explicitly size 5 
float d[5] = b; // means the same thing 
Verwandte Themen