Domanda

Il mio obiettivo era quello di colorare i vertici in base al loro ordine

EDIT: obiettivo molto tempo: l'accesso ai vertici precedenti e seguenti al comportamento gravità simulare

Ho usato seguente codice

#version 120
#extension GL_EXT_geometry_shader4 : enable
void main( void ) {
    for( int i = 0 ; i < gl_VerticesIn ; i++ ) {
        gl_FrontColor = vec4(float(i)/float(gl_VerticesIn),0.0,0.0,1.0);
        gl_Position = gl_PositionIn[i];
        EmitVertex();
    }
}

ma tutti i vertici sono disegnati nero, sembra che i è sempre valutata come 0, mi sto perdendo qualcosa o facendo male?

EDIT: calcolato il meta-problema fuori:. Come nutrire tutta la geometria mi modello in un'unica chiamata geometry shader, in modo che i itera mainloop oltre tutti i vertici, non per ogni triangolo

È stato utile?

Soluzione

Non si lasci un unico geometry shader invocazione iterare su tutti i vertici, viene chiamata per ogni originale primitivo (punto, linea, triangolo, ...).

La soluzione è molto più semplice: nel vertex shader (che in realtà è chiamato per ogni vertice) si può leggere la variabile speciale gl_VertexID , che contiene l'indice del vertice. Tale indice è o solo un contatore incrementato per ogni vertice (se si utilizza glDrawArrays) e reset ogni chiamata estrazione, o indice dall'array indice (se si utilizza glDrawElements).

Modifica Per quanto riguarda l'obiettivo di tempo lungo. Non direttamente, ma si potrebbe utilizzare un consistenza di buffer per questo. Ciò consente in pratica di ottenere array accesso lineare diretto a un oggetto di buffer (nel caso il vertex buffer), che si può quindi solo indice con questo indice vertice. Ma ci potrebbero essere anche altri modi per realizzare questo, che può bastare per un'altra domanda.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top