2012-04-13 23 views
9

Bir XNA/HLSL arka planından gelen libgdx'i kullanarak gölgelendiricileri anlamaya çalışıyorum. Bir gölgelendirici olmadan elde ettiğim çıktıyı çoğaltmak için bir vert/frag shader çifti almaya çalışıyorum, ancak hiçbir şey göstermiyor.libgdx gölgelendiriciler - temel gölgelendirici, ancak ekran boş

Shader oluşturma:

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: burada

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

herhangi bir öneriniz? Ben de OpenGL-ES için yeniyim, bu yüzden bariz bir şey eksik olabilir. Göndermeden önce biraz etrafına baktım ve SpriteBatch.setShader(ShaderProgram) dokümanı şu şekilde oldu:

Bir GLES 2.0 ortamında kullanılacak gölgelendiriciyi ayarlar. Vertex konumu özniteliği "a_position" olarak adlandırılır, doku koordinatları özniteliği "a_texCoords0" olarak adlandırılan , renk özniteliği "a_color" olarak adlandırılır. Bkz. ShaderProgram.POSITION_ATTRIBUTE, ShaderProgram.COLOR_ATTRIBUTE ve ShaderProgram.TEXCOORD_ATTRIBUTE, 'a eklenen 0COTO_DATTRIBUTE, ilk doku biriminin kullanımını belirtir. Projeksiyon matrisi, "u_proj" adı verilen bir mat4 forması aracılığıyla yüklenen , dönüşüm matrisi "u_trans" adlı bir üniforma yoluyla yüklenen , birleştirilmiş dönüşüm ve projeksiyon matrisi, "u_projTrans" adı verilen bir mat4 üniforması yoluyla yüklenir. Doku örnekleyici "u_texture" adında bir üniforma ile geçirilir. Varsayılan gölgelendiriciyi kullanmak için bu yöntemi null argümanı ile çağırın.

+2

Hmm, GLSL Spec içerir: 'Genel olarak, dilin kullanımı Bu karakter kümesi büyük/küçük harfe duyarlıdır. Bu, Tanımlayıcıların büyük/küçük harfe duyarlı olduğu anlamına mı geliyor? Tanımlayıcılar bölümünde bu konuda bir kelime bulunmuyor. (vertex shader, 'a_Position',' a_position 'yorumunu içerir) –

+0

Evet, haklı gibi görünüyorsun. SpriteBatch'in gölgelendiricisini nasıl oluşturduğunu kontrol ettim ve öncelikli olarak bir kapak sorunuydu. Ayrıca varsayılan gölgelendiricilerin ne olduğunu anladım - Aşağıdakileri yayınlayacağım. – NumberOverZero

cevap

12

Kod SpriteBatch'a baktıktan sonra kodumda birkaç hatam var gibi görünüyor. Aşağıda doğru shaderlar şunlardır:

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

Ayrıca bu öğreticinin neden bozuk olduğu: https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson1 –