2015-11-03 22 views
9

Quindi sto imparando un po 'di OpenGL, è molto da imparare e sono solo un principiante, ma non capisco il "Qualificatore di layout" in GLSL.OpenGL: qualificatore di layout?

Quindi qualcosa di simile:

layout (location = 0) in vec3 position; 

in un vertex shader semplice come questo:

#version 330 core 
layout (location = 0) in vec3 position; // The position variable has attribute position 0 

out vec4 vertexColor; // Specify a color output to the fragment shader 

void main() 
{ 
    gl_Position = vec4(position, 1.0); // See how we directly give a vec3 to vec4's constructor 
    vertexColor = vec4(0.5f, 0.0f, 0.0f, 1.0f); // Set the output variable to a dark-red color 
} 

Capisco la vec4 per esempio (in quanto questo è andare allo shader frammento). E il vertexColor ha senso, per esempio.

Ma forse non capisco la "posizione" e cosa significa esattamente in questo senso? Qualcuno si preoccupa di spiegare? Il wiki opengl onestamente non mi ha aiutato.

Ma forse ho frainteso quello che un vertex shader (sono ancora ovviamente un po 'insicuro del gasdotto). ma dalla mia comprensione la specificazione dei vertici è la prima cosa che correggiamo? (Vertici/Indici se necessario) e memorizzarli in un VAO.

Quindi il vertex shader interagisce con ogni singolo punto di vertice? (spero) perché è così che l'ho capito?

risposta

9

Hai ragione, il vertex shader viene eseguito per ogni vertice.

Un vertice è composto da o più attributi (posizioni, normali, coordinate di trama ecc.).

Sul lato CPU quando si crea il VAO, si descrive ogni attributo dicendo "questi dati in questo buffer saranno attributo 0, i dati adiacenti saranno attributo 1 ecc.". Si noti che il VAO memorizza solo queste informazioni di chi è chi. I dati dei vertici effettivi sono memorizzati in VBO.

Nel vertex, la linea con il layout e la posizione è solo dicendo "supporta l'attributo 0 e metterlo in una posizione variabile chiamata" (la posizione rappresenta il numero dell'attributo).

Se i due passaggi vengono eseguiti correttamente, si dovrebbe finire con una posizione nella variabile denominata posizione :) È più chiaro?

+1

Quindi perché dovresti usare qualcosa MA zero? – msmith1114

+1

Beh, se per esempio hai posizioni e normali, puoi posizionare l'attributo 0 e le normali nell'attributo 1. Non puoi inserire entrambi nell'attributo 0. – Jerem

+0

Ah che ha senso, o qualcosa come la posizione nell'attributo 0, e i colori in 1 o qualcosa del genere. – msmith1114

Problemi correlati