2012-04-13 4 views
9

Ich versuche zu verstehen, Shadern mit libgdx, kommt aus einem XNA/HLSL-Hintergrund. Ich versuche, ein vert/frag Shader-Paar zu erhalten, um die Ausgabe ohne Shader zu reproduzieren, aber es zeigt nichts an.libgdx Shaders - grundlegende Shader, aber der Bildschirm ist leer

Shader Kreation:

void SetupShader() 
{ 
    ShaderProgram.pedantic = false; 
    shader = new ShaderProgram(
      Gdx.files.internal("assets/default.vert").readString(), 
      Gdx.files.internal("assets/default.frag").readString()); 
    if(!shader.isCompiled()) { 
     Gdx.app.log("Problem loading shader:", shader.getLog()); 
    } 
    batch.setShader(shader); 
} 

default.vert:

attribute vec4 a_Position; 
attribute vec4 a_Normal; 
attribute vec2 a_TexCoord; 
attribute vec4 a_Color; 

uniform mat4 u_projTrans; 

varying vec2 v_texCoords; 
varying vec4 v_color; 

void main() { 
    v_color = a_Color; 
    v_texCoords = a_TexCoord; 
    gl_Position = u_projTrans * a_Position; 
} 

default.frag:

#ifdef GL_ES 
precision mediump float; 
#endif 

varying vec2 v_texCoords; 
varying vec4 v_color; 

void main() { 
    gl_FragColor = v_color; 
} 

Rendering:

batch.begin(); 
for (GameObject gObj : gameObjects) 
    gObj.Draw(batch); 
batch.end(); 

Alle hier Anregungen? Ich bin auch neu bei OpenGL-ES, daher kann mir etwas offensichtlich fehlen. Ich sah mich um ein wenig vor der Veröffentlichung, und die doc für SpriteBatch.setShader(ShaderProgram) war wie folgt:

die Shader-Sets in einer GLES 2.0-Umgebung verwendet werden. Scheitelpunktposition Attribut heißt "a_position", das Texturkoordinatenattribut ist , genannt "a_texCoords0", das Farbattribut heißt "a_color". Siehe ShaderProgram.POSITION_ATTRIBUTE, ShaderProgram.COLOR_ATTRIBUTE und ShaderProgram.TEXCOORD_ATTRIBUTE, das "0" erhält, das an angefügt wird, zeigen die Verwendung der ersten Textureinheit an. Die Projektionsmatrix ist hochgeladen über eine Matte4 Uniform namens "u_proj", die Transformationsmatrix ist hochgeladen über eine Uniform namens "U_trans", die kombinierte Transformation und Projektion matrx ist über eine Matte4 Uniform namens "u_projTrans" hochgeladen. Der Textur-Sampler wird über eine Uniform namens "u_texture" übergeben. Rufen Sie diese Methode mit einem Null-Argument auf, um den Standard-Shader zu verwenden.

+2

Hmm, enthält die GLSL-Spezifikation: 'Im Allgemeinen ist die Verwendung der Sprache der Dieser Zeichensatz ist case sensitive.'. Bedeutet das, dass Identifikatoren die Groß-/Kleinschreibung beachten? Der Abschnitt Identifiers enthält kein Wort darüber. (Der Vertex-Shader enthält 'a_Position', den Kommentar' a_position') –

+0

Ja, es sieht so aus als hättest du recht gehabt. Ich habe überprüft, wie 'SpriteBatch' seinen Shader erstellt, und es war hauptsächlich ein Cap-Problem. Ich habe auch herausgefunden, was die Standard-Shader sind - ich werde diese unten posten. – NumberOverZero

Antwort

12

Nach dem Blick auf den Code in SpriteBatch scheint es, dass ich ein paar Fehler in meinem Code hatte. Im Folgenden sind die richtigen Shadern:

default.vert:

attribute vec4 a_position; 
attribute vec4 a_color; 
attribute vec2 a_texCoord0; 

uniform mat4 u_projTrans; 

varying vec4 v_color; 
varying vec2 v_texCoords; 

void main() { 
    v_color = a_color; 
    v_texCoords = a_texCoord0; 
    gl_Position = u_projTrans * a_position; 
} 

default.frag:

#ifdef GL_ES 
    precision mediump float; 
#endif 

varying vec4 v_color; 
varying vec2 v_texCoords; 
uniform sampler2D u_texture; 

void main() { 
    gl_FragColor = v_color * texture2D(u_texture, v_texCoords); 
} 
+1

Auch der Grund, warum dieses Tutorial gebrochen ist: https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson1 –