2013-03-02 4 views
5

ho 9 quad fatte di triangoli, come questo:Usa consistenza diversa per i triangoli specifici in VBO

enter image description here

che sto usando VBO per memorizzare i dati su di loro - la loro posizione e le coordinate texture.

La mia domanda è: è possibile che il quad 5 abbia una trama diversa rispetto al resto dei quad utilizzando solo uno VBO e shader? :

enter image description here

colore verde rappresenta texture 1 e giallo - struttura 2.

Finora ho ottenuto:

GLfloat vertices[] = { 
    // Positions 
    0.0f, 0.0f, 
    ... 

    // Texture coordinates 
    0.0f, 0.0f, 
    ... 
}; 

Sto creando VBO utilizzando tale vertices[] array, e poi Ho vincolato la mia prima texture m_texture1 (ho anche accesso alla seconda versione - m_texture2) e ho chiamato lo shader:

glBindTexture(GL_TEXTURE_2D, m_texture1); 

glUseProgram(program); 

glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vboId);   // for vertex coordinates 
glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);          // Vertices 
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)(sizeof(GLfloat)*108));   // Texture 
glDrawArrays(GL_TRIANGLES, 0, 108); 
glDisableVertexAttribArray(0); 
glDisableVertexAttribArray(1); 

glUseProgram(0); 

mio vertex shader:

#version 330 

layout (location = 0) in vec4 position; 
layout (location = 1) in vec2 texcoord; 

out vec2 Texcoord; 

void main() 
{ 
    gl_Position = position; 
    Texcoord = texcoord; 
} 

E frammento di shader:

#version 330 

in vec2 Texcoord; 

out vec4 outputColor; 

uniform sampler2D tex; 

void main() 
{ 
    outputColor = texture(tex, Texcoord) * vec4(1.0,1.0,1.0,1.0); 
} 

Quindi, fondamentalmente sto usando qui solo quella consistenza, perché non ho idea di come avrei potuto utilizzare la seconda uno.

risposta

2

È possibile farlo utilizzando diversi texture image units e impostandone i valori su uniform sampler2D tex.

Dovresti chiamare glActiveTexture e impostare l'unità di trama (GL_TEXTURE0), associare la trama verde, quindi impostare la trama attiva su GL_TEXTURE1 e associare la trama gialla. In questo modo la texture verde avrà l'unità di immagine dell'immagine 0 e gialla 1.

Dovresti dividere le chiamate di disegno in due: una per i quad verdi e l'altra per il giallo. Dovrai impostare quale texture usare impostando il tuo uniform sampler2D tex usando glUniform1i per ogni chiamata. E infine chiama glDrawArrays per un sottoinsieme di triangoli nel VBO che indica quelli verdi o gialli che stai disegnando in una chiamata corrente.

Inoltre, potresti prendere in considerazione l'utilizzo di texture atlas se tutto ciò che devi disegnare è un'immagine nel tuo esempio. In quel caso avresti una singola texture mappata in una singola chiamata.

+0

Grazie per la risposta. Per essere onesti, ce l'ho in una texture, ma poiché avevo bisogno di stili diversi per la trama esterna e interna (GL_REPEAT e GL_CLAMP) l'ho diviso in due, ma forse è possibile in qualche modo modificare quei parametri solo per quad interno? –

+0

@Mosquito, in questo caso non utilizzare due trame. – Kimi

+0

Ok, grazie ancora. :-) –