我试图了解使用 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);
}
默认.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;
}
默认片段:
#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 参数调用此方法以使用默认着色器。