2013-09-21 13 views
11

Ho letto alcuni tutorial su GLSL. In certi attributi position è un vec4 in alcuni vec3. So che le operazioni con la matrice hanno bisogno di un vec4, ma vale la pena inviare un elemento aggiuntivo? Non è meglio inviare vec3 e successivamente cast nello shader vec4 (posizione, 1.0)? Meno dati in memoria: sarà più veloce? O dovremmo impacchettare un elemento in più per evitare il casting?Posizione shader vec4 o vec3

Qualche consiglio, cosa dovrebbe essere meglio?

layout(location = 0) in vec4 position; 
MVP*position; 

o

layout(location = 0) in vec3 position; 
MVP*vec4(position,1.0); 

risposta

19

Per gli attributi vertice, questo non importa. Il quarto componente viene automaticamente esteso a 1.0 quando è assente.

Vale a dire, se si passa un puntatore di attributo di vertice tridimensionale a un vettore a 4 dimensioni, GL riempirà W con 1.0. Vado sempre con questo percorso, evita di dover scrivere esplicitamente vec4 (...) quando si fa la moltiplicazione della matrice sulla posizione ed evita anche di sprecare memoria memorizzando il 4 ° componente.

Questo vale anche per le coordinate 2D. Una coordinata 2D passata a un attributo vec4 diventa vec4 (x, y, 0.0, 1.0). La regola generale è questa: tutti i componenti mancanti vengono sostituiti con 0.0 ad eccezione di W, che viene sostituito con 1.0.

Tuttavia, per le persone che non sono consapevoli del comportamento di GLSL in questa circostanza, può essere fonte di confusione. Suppongo che questo è il motivo per cui la maggior parte dei tutorial non tocca mai questo argomento.

+0

Significa che posso utilizzare: glBufferSubData (GL_ARRAY_BUFFER, 0, vertice * 3, dati); glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, 0); e negli shader utilizzare il layout (posizione = 0) nella posizione vec4; " espressione? – Skides

+2

Sì, questo è ciò che significa. Se lo fai, GLSL aggiungerà 1.0 per W ogni volta che proverai ad accedervi. –

+0

Solo una rapida domanda in più: questo vale per più di 'GLfloat'? Cioè, sarebbe la stessa espansione per un 'dvec2' ->' dvec4' o 'ivec2' ->' ivec4'? – ThePhD

Problemi correlati