2012-04-13 15 views
9

Sto cercando di capire gli shader usando libgdx, provenienti da uno sfondo XNA/HLSL. Sto cercando di ottenere una coppia shader vert/frag per riprodurre l'output che ottengo senza uno shader, ma non visualizza nulla. creazioneshader libgdx - shader di base, ma lo schermo è vuoto

Shader:

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

Qualche suggerimento qui? Sono nuovo anche per OpenGL-ES, quindi potrei mancare qualcosa di ovvio. Mi sono guardato un po 'prima di postare e il documento per SpriteBatch.setShader(ShaderProgram) era il seguente:

Imposta lo shader da utilizzare in un ambiente GLES 2.0. L'attributo posizione vertice si chiama "a_position", l'attributo delle coordinate texture è chiamato "a_texCoords0" chiamato, l'attributo color è chiamato "a_color". Vedere ShaderProgram.POSITION_ATTRIBUTE, ShaderProgram.COLOR_ATTRIBUTE e ShaderProgram.TEXCOORD_ATTRIBUTE che ottiene "0" applicato a indicano l'uso della prima unità di trama. La matrice di proiezione è caricata tramite una uniforme mat4 denominata "u_proj", la matrice di trasformazione è caricata tramite un'uniforme chiamata "u_trans", la trasformata combinata e la matrice di proiezione viene caricata tramite un'uniforme mat4 denominata "u_projTrans". Il campionatore di texture viene passato tramite un'uniforme chiamata "u_texture". Chiamare questo metodo con un argomento null per utilizzare lo shader predefinito .

+2

Hmm, la specifica GLSL contiene: 'In generale, l'uso del linguaggio questo set di caratteri è case sensitive. Questo significa che gli identificatori sono case sensitive? La sezione Identificatori non contiene una parola a riguardo. (il vertex shader contiene 'a_Position', il commento' a_position') –

+0

Sì, sembra che tu abbia ragione. Ho verificato come 'SpriteBatch' crea il suo shader, ed era principalmente un problema di maiuscole. Ho anche capito quali sono gli shader predefiniti - li posterò qui sotto. – NumberOverZero

risposta

12

Dopo aver visto il codice in SpriteBatch sembra che ho avuto alcuni errori nel mio codice. Qui di seguito sono gli shader corrette:

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

Anche il motivo per cui questo tutorial è stato risolto: https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson1 –