我想在2D-libgdx项目中使用一个简单的着色器,使用OpenGL ES。我之前从未使用过OpenGL ES,所以也许我的标题不正确?
顶点着色器:
in vec3 position;
in vec2 textureCoords;
out vec2 passTextureCoords;
void main(void)
{
gl_Position = vec4(position.x, position.y, position.z, 1.0);
passTextureCoords = textureCoords;
}
片段着色器:
#ifdef GL_ES
precision mediump float;
#endif
in vec2 passTextureCoords;
out vec4 outColour;
uniform sampler2D textureSampler;
void main(void)
{
// Get color at coordinate by sampler and output it
// outColour = texture(textureSampler, passTextureCoords);
// gl_FragColor = vec4(1.0,0.0,0.0,1.0);
outColour = vec4(1.0, 0.0, 0.0, 1.0);
}
实际上我过去经常使用OpenGL 3+,但从不和Libgdx一起使用,也从不使用OpenGL ES。
这个着色器应该做什么:取每个像素并返回红色。但我得到的只是白色。
我这样创建:
private ShaderProgram shader;
this.shader = new ShaderProgram(Gdx.files.internal("shaders/test.vertex").readString(), Gdx.files.internal("shaders/test.fragment").readString());
this.shader.pedantic = false;
并像这样渲染:
public void render(SpriteBatch spriteBatch)
{
spriteBatch.setShader(this.shader);
model.render(spriteBatch);
spriteBatch.setShader(null);
outline.render(spriteBatch);
}
我得到的只是模型的白色,而不是红色。所以我觉得有些不对劲。我不想再指定任何制服,所以我将迂腐变为假。我做错了什么?
答案 0 :(得分:3)
Libgdx仍然使用OpenGL ES 2.0,因此着色器需要不同的关键字。 (这在OpenGL ES 3.0中有所改变,因此它更接近OpenGL 3.x,但Libgdx还没有完全支持它。)
in
替换顶点着色器中的关键字attribute
。out
替换顶点着色器中的关键字varying
。in
替换片段着色器中的关键字varying
。outColour
并使用内置的gl_FragColor
此外,您必须使用SpriteBatch所期望的属性名称,因此您的属性必须为a_position
,a_texCoord0
,并且如果您需要a_color
。同样,你的制服必须是SpriteBatch所使用的,所以将textureSampler
更改为u_texture
。
我看到你在注释掉的代码中调用函数texture
,但在OpenGL ES 2.0中,你需要使用函数texture2D
代替。