2013-03-02 8 views
5

Ich habe 9 Quads aus Dreiecken, wie folgt aus:Verwenden Sie unterschiedliche Textur für bestimmte Dreiecke in VBO

enter image description here

ich VBO bin mit Daten zu speichern, um sie - ihre Position und Texturen Koordinaten.

Meine Frage ist - ist es möglich, das Quad 5 zu einer anderen Textur als der Rest von Quads mit nur einer VBO und shader haben? :

enter image description here

grüne Farbe darstellt Textur 1 und gelb - Textur 2.

Bisher bekam ich:

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

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

Ich schaffe VBO unter Verwendung dass vertices[] Array, und dann Ich binde meine erste Textur m_texture1 (ich habe auch Zugriff auf die zweite - m_texture2) und Aufruf 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); 

Mein 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; 
} 

und Fragment-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); 
} 

Also im Grunde hier nur ich bin mit, dass eine Textur, weil ich keine Ahnung, wie ich die zweite verwenden könnte ein.

Antwort

2

Sie können dies mit anderen texture image units und setzen Sie ihre Werte auf uniform sampler2D tex.

Sie müssten glActiveTexture aufrufen und Texture Image Unit (GL_TEXTURE0) festlegen, Ihre grüne Textur binden, dann die aktive Textur auf GL_TEXTURE1 setzen und Ihre gelbe Textur binden. Auf diese Weise erhält Ihre grüne Textur die Textur image unit id 0 und yellow 1.

Sie müssten Ihre Zeichenaufrufe in zwei teilen: eine für grüne Quads und andere für gelb. Sie müssen festlegen, welche Textur verwendet werden soll, indem Sie uniform sampler2D tex mit glUniform1i für jeden Anruf festlegen. Und schließlich rufen Sie glDrawArrays für eine Teilmenge von Dreiecken in Ihrem VBO grün oder gelb an, die Sie in einem aktuellen Anruf zeichnen.

Sie könnten auch eine texture atlas verwenden, wenn Sie nur ein Bild in Ihrem Beispiel zeichnen müssen. In diesem Fall würde eine einzelne Textur in einem einzelnen Aufruf zugeordnet werden.

+0

Danke für die Antwort. Um ehrlich zu sein, habe ich es in einer Textur, aber weil ich verschiedene Stile für äußere und innere Textur (GL_REPEAT und GL_CLAMP) brauchte, habe ich es in zwei geteilt, aber vielleicht ist es möglich, diese Parameter nur für Inner Quad zu ändern? –

+0

@Mosquito, nein in diesem Fall zwei Texturen verwenden. – Kimi

+0

Ok, nochmals vielen Dank. :-) –

Verwandte Themen