libgdx着色器 - 基本着色器,但屏幕为空白

时间:2012-04-13 16:50:30

标签: java opengl-es libgdx shader

我正在尝试使用libgdx来理解着色器,来自XNA / HLSL背景。我正在尝试使用vert / frag着色器对来重现我没有着色器的输出,但它没有显示任何内容。

着色器创建:

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;
}

渲染:

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

这里有什么建议吗?我也是OpenGL-ES的新手,所以我可能会遗漏一些明显的东西。在发布之前我环顾了一下,SpriteBatch.setShader(ShaderProgram)的文档如下:

  

设置要在GLES 2.0环境中使用的着色器。顶点位置   属性称为“a_position”,纹理坐标属性为   称为“a_texCoords0”,颜色属性称为“a_color”。   请参见ShaderProgram.POSITION_ATTRIBUTE,ShaderProgram.COLOR_ATTRIBUTE   和ShaderProgram.TEXCOORD_ATTRIBUTE,其中包含“0”   表示使用第一个纹理单元。投影矩阵是   通过称为“u_proj”的mat4制服上传,变换矩阵为   通过称为“u_trans”的统一上传,组合变换和   投影matrx是通过mat4统一上传的   “u_projTrans”。纹理采样器通过一个叫做的制服传递   “u_texture”。使用null参数调用此方法以使用默认值   着色器。

1 个答案:

答案 0 :(得分:12)

查看SpriteBatch中的代码后,似乎我的代码中出现了一些错误。以下是正确的着色器:

<强> 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);
}