Libgdx中的简单OpenGL ES着色器输出为白色应为红色

时间:2015-07-29 13:13:31

标签: java opengl-es libgdx shader

我想在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);
}

我得到的只是模型的白色,而不是红色。所以我觉得有些不对劲。我不想再指定任何制服,所以我将迂腐变为假。我做错了什么?

1 个答案:

答案 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_positiona_texCoord0,并且如果您需要a_color。同样,你的制服必须是SpriteBatch所使用的,所以将textureSampler更改为u_texture

我看到你在注释掉的代码中调用函数texture,但在OpenGL ES 2.0中,你需要使用函数texture2D代替。