2012-04-13 19 views
9

Estoy tratando de entender los sombreadores que usan libgdx, que provienen de un fondo XNA/HLSL. Estoy tratando de obtener un par de vert/shader de frag para reproducir la salida que obtengo sin un shader, pero no muestra nada. creaciónsombreadores libgdx: sombreador básico, pero la pantalla está en blanco

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

Cualquier sugerencia aquí? Soy nuevo en OpenGL-ES también, por lo que me puede estar perdiendo algo obvio. Miré alrededor un poco antes de publicar, y el documento para SpriteBatch.setShader(ShaderProgram) fue el siguiente:

Establece el sombreado que se utilizará en un entorno GLES 2.0. El atributo de posición de vértice se llama "a_position", el atributo de coordenadas de textura es llamado "a_texCoords0", el atributo de color se llama "a_color". Consulte ShaderProgram.POSITION_ATTRIBUTE, ShaderProgram.COLOR_ATTRIBUTE y ShaderProgram.TEXCOORD_ATTRIBUTE que obtiene "0" en indica el uso de la primera unidad de textura. La matriz de proyección es cargada mediante un uniforme mat4 llamado "u_proj", la matriz de transformación es cargada mediante un uniforme llamado "u_trans", la transformación combinada y la matriz de proyección se carga mediante un uniforme mat4 llamado "u_projTrans". La muestra de textura se pasa a través de un uniforme llamado "u_texture". Llame a este método con un argumento nulo para usar el sombreador predeterminado .

+2

Hmm, la especificación GLSL contiene: 'En general, el uso de la lengua de este juego de caracteres es sensible a mayúsculas y minúsculas. ¿Significa esto que los identificadores distinguen entre mayúsculas y minúsculas La sección identificadores no contiene una palabra al respecto. (el sombreador de vértices contiene 'a_Position', el comentario' a_position') –

+0

Sí, parece que tenía razón. Me registré en cómo 'SpriteBatch' crea su sombreador, y era principalmente un problema de mayúsculas. También descubrí cuáles son los sombreadores predeterminados: los publicaré a continuación. – NumberOverZero

Respuesta

12

Después de mirar el código en SpriteBatch parece que cometí algunos errores en mi código. A continuación se presentan los shaders correctas:

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

También la razón por la cual este tutorial está roto: https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson1 –

Cuestiones relacionadas