2010-08-16 8 views
8

Ich versuche, texturierte Punkte (z. B. Punktsprites) in OpenGL ES 2.0 für ein Partikelsystem zu implementieren. Problem, das ich habe, ist die Punkte, die alle als feste schwarze Quadrate dargestellt werden, anstatt die Textur richtig zugeordnet zu haben.Strukturierte Punkte in OpenGL ES 2.0?

Ich habe überprüft, dass gl_PointCoord tatsächlich x/y-Werte von 0,0 bis 1,0 zurückgibt, die über die gesamte Textur abbilden würden. Der texture2D-Aufruf scheint jedoch immer schwarz zu sein.

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

Und mein 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); 
} 

Die Textur in Frage ist 16x16. Ich kann diese Textur erfolgreich auf andere Geometrie abbilden, aber aus irgendeinem Grund nicht auf Punkte.

Meine Plattform ist ein Motorola Droid mit Android 2.2.

+0

Mißachtung, ich habe ein Problem mit meiner Textur Laderoutine hatte. Funktioniert jetzt großartig. – Ivan

+1

Sie hätten sagen können, was das Problem war und wie Sie es gelöst haben ... –

+0

War es nur das Laden der Textur? Wie gibst du es an den Shader weiter? Prost – DiogoNeves

Antwort

14

Sie wählen Ihre Textur als aktiv und binden sie - wie normalerweise. Aber Sie müssen Ihre Textureinheit dem Shader-Programm als Einheit übergeben. Sie können also die gl_PointCoord als Texturkoordinaten in Ihrem Fragment-Shader verwenden.

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

Und Ihre Fragment-Shader sollte folgendermaßen aussehen:

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