libgdx着色器-基础着色器,但屏幕是空白的

9

我正在尝试使用libgdx理解着色器,之前是从XNA/HLSL背景转过来的。我试图使用一个顶点/片段着色器对输出进行重现,但它没有显示任何内容。

着色器创建:

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”的统一变量上传,组合变换和投影矩阵通过名为“u_projTrans”的mat4统一变量上传。纹理采样器通过名为“u_texture”的统一变量传递。调用此方法并输入null参数以使用默认着色器。

2
嗯,GLSL规范中包含:“一般来说,该语言对此字符集的使用是区分大小写的。”这是否意味着标识符是区分大小写的?标识符部分没有提到这一点。(顶点着色器包含a_Position,注释中包含a_position - Stefan Hanke
是的,看起来你是对的。我查了一下SpriteBatch如何创建它的着色器,主要是大小写问题。我还找出了默认的着色器-我会在下面发布它们。 - user312364
1个回答

14

在查看了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);
}

1
这个教程失效的原因是: https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson1 - Oliver Dixon
1
这个方法在2020年对我也起作用了。似乎互联网上有很多错误的例子,而且涉及到GL/GLSL/ES和libGDX版本级别的多维API变化,这让人有点沮丧。 - Andreas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接