2010-08-16 23 views
8

Próbuję zaimplementować punkty teksturowane (np. Spity punktowe) w OpenGL ES 2.0 dla systemu cząstek. Problem, który mam, to wszystkie punkty renderowane jako stałe czarne kwadraty, a nie poprawnie odwzorowane tekstury.Teksturowane punkty w OpenGL ES 2.0?

Sprawdziłem, czy gl_PointCoord rzeczywiście zwraca wartości x/y z 0.0 do 1.0, które byłyby mapowane na całej teksturze. Wywołanie texture2D zawsze wydaje się jednak czarne.

Moja vertex shader:

attribute vec4 aPosition; 
attribute float aAlpha; 
attribute float aSize; 
varying float vAlpha; 
uniform mat4 uMVPMatrix; 

void main() { 
    gl_PointSize = aSize; 
    vAlpha = aAlpha; 
    gl_Position = uMVPMatrix * aPosition; 
} 

A mój fragment shader:

precision mediump float; 
uniform sampler2D tex; 
varying float vAlpha; 

void main() { 
    vec4 texColor = texture2D(tex, gl_PointCoord); 
    gl_FragColor = vec4(texColor.rgb, texColor.a * vAlpha); 
} 

Tekstury w pytaniu 16x16. Jestem w stanie z powodzeniem zamapować tę teksturę na inną geometrię, ale z jakiegoś powodu nie do punktów.

Moja platforma to Motorola Droid z systemem Android 2.2.

+0

Zignoruj, miałem problem z moim tekstury załadunku rutyny. Działa teraz świetnie. – Ivan

+1

Mogłeś powiedzieć, jaki był problem i jak go rozwiązać ... –

+0

Czy to tylko ładowanie tekstury? Jak przekazujesz to do modułu cieniującego? Twoje zdrowie – DiogoNeves

Odpowiedz

14

Wybrałeś teksturę jako aktywną i powiążesz ją - jak zwykle. Ale musisz przekazać swoją jednostkę teksturową jako jednolitą do programu cieniującego. Możesz więc użyć gl_PointCoord jako współrzędnych tekstury w module cieniującym fragment.

glUniform1i(MY_TEXTURE_UNIFORM_LOCATION, 0); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, yourTextureId); 
glEnable(GL_TEXTURE_2D); 
glDrawArrays(GL_POINTS, 0, pointCount); 
glDisable(GL_TEXTURE_2D); 

A twój fragment shader powinien wyglądać następująco:

uniform sampler2D texture; 
void main () 
{ 
    gl_FragColor = texture2D(texture, gl_PointCoord); 
}