2013-03-02 9 views
5

mam 9 quadów wykonanych z trójkątów, na przykład:Użyj innego tekstury dla określonych trójkątów w VBO

enter image description here

Używam VBO do przechowywania danych o nich - swoją pozycję i współrzędne tekstury.

Moje pytanie brzmi - czy można sprawić, że quad 5 ma inną teksturę niż pozostałe quady, używając tylko jednego VBO i shader? :

enter image description here

Zielony kolor oznacza tekstury 1 i żółty - tekstury 2.

Do tej pory mam:

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

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

Tworzę VBO używając że vertices[] tablicy, a następnie mam wiążący swoją pierwszą fakturę m_texture1 (i również mieć dostęp do drugiego - m_texture2) i wywołanie 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); 

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

I 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); 
} 

Więc w zasadzie używam tutaj tylko, że jedna faktura, bo nie mam pojęcia, jak można użyć drugiego jeden.

Odpowiedz

2

Można to zrobić przy użyciu różnych texture image units i ustawiania ich wartości uniform sampler2D tex.

Musisz zadzwonić pod numer glActiveTexture i ustawić jednostkę obrazu tekstury (GL_TEXTURE0), związać zieloną teksturę, a następnie aktywować aktywną teksturę do GL_TEXTURE1 i powiązać żółtą teksturę. W ten sposób Państwa zielone tekstury będą miały jednostki tekstur obrazu id 0 i żółty 1.

trzeba by podzielić rysunek nazywa się dwa: jeden dla zielonych quadów oraz inne dla żółtego. Będziesz musiał ustawić, której tekstury użyć, ustawiając uniform sampler2D tex przy użyciu glUniform1i dla każdego połączenia. I na koniec zadzwoń pod numer glDrawArrays dla podzbioru trójkątów w twoim VBO, wskazując zielone lub żółte, które rysujesz w bieżącej rozmowie.

Ponadto można rozważyć użycie texture atlas jeśli wszystko trzeba wyciągnąć to zdjęcie w swoim przykładzie. W takim przypadku miałbyś pojedynczą teksturę zmapowaną w jednym wywołaniu.

+0

Dzięki za odpowiedź. Szczerze mówiąc, mam go w jednej fakturze, ale ponieważ potrzebowałem różnych stylów dla zewnętrznej i wewnętrznej tekstury (GL_REPEAT i GL_CLAMP), podzieliłem go na dwie części, ale może możliwe jest jakoś zmienić te parametry tylko dla wewnętrznego kwadratu? –

+0

@Mosquito, nie w tym przypadku użyj dwóch tekstur. – Kimi

+0

OK, jeszcze raz dziękuję. :-) –

Powiązane problemy