【问题标题】:libgdx shaders- basic shader, but screen is blanklibgdx 着色器 - 基本着色器,但屏幕为空白
【发布时间】:2012-04-26 01:31:48
【问题描述】:

我正在尝试了解使用 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”的制服上传,组合变换和 投影矩阵是通过名为 mat4 的制服上传的 “u_projTrans”。纹理采样器通过一个名为 “u_texture”。使用 null 参数调用此方法以使用默认值 着色器。

【问题讨论】:

  • 嗯,GLSL 规范包含:In general, the language’s use of this character set is case sensitive.。这是否意味着标识符区分大小写? Identifiers 部分不包含关于它的词。 (顶点着色器包含a_Position,注释a_position
  • 是的,看起来你是对的。我检查了SpriteBatch 如何创建它的着色器,这主要是一个大写问题。我还弄清楚了默认着色器是什么——我将在下面发布。

标签: java opengl-es libgdx shader


【解决方案1】:

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

【讨论】:

  • 也是这个教程坏掉的原因:github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson1
  • 这在 2020 年也对我有用。互联网上似乎有很多错误的例子,而且涉及 GL/GLSL/ES 和 libGDX 的这种多维 API 更改有点令人沮丧版本级别。