2012-04-13 24 views
9

Próbuję zrozumieć shadery za pomocą libgdx, pochodzących z tła XNA/HLSL. Próbuję uzyskać parę modułów cieniowania vert/frag, aby odtworzyć dane wyjściowe uzyskane bez modułu cieniującego, ale nic nie wyświetla. tworzenieshadery libgdx - podstawowy shader, ale ekran jest pusty

cieniowania:

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

Wszelkie sugestie tutaj? Jestem również nowicjuszem w OpenGL-ES, więc być może brakuje mi czegoś oczywistego. Rozejrzałem się trochę przed opublikowaniem, a dokumentacja dla SpriteBatch.setShader(ShaderProgram) była następująca:

Ustawia moduł cieniujący, który ma być używany w środowisku GLES 2.0. Pozycja wierzchołka Atrybut nazywa się "a_position", atrybut współrzędnych tekstury to nazywany "a_texCoords0", atrybut koloru nazywa się "a_color". Zobacz ShaderProgram.POSITION_ATTRIBUTE, ShaderProgram.COLOR_ATTRIBUTE i ShaderProgram.TEXCOORD_ATTRIBUTE, które otrzymuje wartość "0" dołączoną do wskazują na użycie pierwszej jednostki tekstur. Macierz projekcji to przesłana za pośrednictwem macierzy mat4 zwanej "u_proj", macierz przekształcenia przesłana przez uniform zwany "u_trans", połączona transformata i matryca projekcyjna jest ładowana poprzez uniform mat4 o nazwie "u_projTrans". Próbnik tekstury jest przekazywany za pomocą jednolitego zwanego "u_texture" o nazwie . Wywołaj tę metodę argumentem zerowym, aby użyć domyślnego modułu cieniującego .

+2

Hmm, spec GLSL zawiera: 'Na ogół posługują się językiem z dnia ten zestaw znaków rozróżnia wielkość liter. ". Czy to oznacza, że ​​w identyfikatorach jest rozróżniana wielkość liter? Sekcja Identyfikatory nie zawiera słów o tym. (Cień wierzchołka zawiera 'a_Position', komentarz' a_position') –

+0

Tak, wygląda na to, że miałeś rację. Sprawdziłem, w jaki sposób 'SpriteBatch' tworzy swój moduł cieniujący i był to przede wszystkim problem z nakrętkami. Dowiedziałem się również, jakie są domyślne shadery - opublikuję te poniżej. – NumberOverZero

Odpowiedz

12

Po przejrzeniu kodu w SpriteBatch wydaje się, że miałem kilka błędów w moim kodzie. Poniżej są poprawne shadery:

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

Powód tego samouczka jest uszkodzony: https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson1 –

Powiązane problemy