【问题标题】:Simple OpenGL ES Shader in Libgdx Output is white should be redLibgdx 输出中的简单 OpenGL ES 着色器是白色的应该是红色的
【发布时间】:2015-07-29 13:13:31
【问题描述】:

我想在我的 2D-libgdx-project 中使用一个简单的着色器,使用 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);
}

我得到的只是模型的白色,而不是红色。所以我猜有些不对劲。我不想再指定任何制服,所以我将 pedantic 设置为 false。我做错了什么?

【问题讨论】:

    标签: java opengl-es libgdx shader


    【解决方案1】:

    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

    【讨论】:

    • 谢谢,这有帮助,但仍然没有好的着色器。我的意思是,我现在得到了一个巨大的红色矩形,它离应该渲染的地方很远。
    • 你的模型坐标是多少?对我来说,您使用 SpriteBatch 渲染“模型”并且没有使用定义的投影,这对我来说似乎有点奇怪。默认投影是从 -Z 轴向下看的 (-1,-1) 到 (1,1) 的正交视图。
    • @Teolha ,作为tenfour04的awnser的替代品,你可以启用opengl es 3.0,最新版本支持它,如果你的硬件也支持它,你不会有任何问题。(cfg.useGL30=true ; 创建桌面或android启动类时到ApplicationConfiguration)
    • @SteveL @Teolha 您还需要在两个着色器的顶部添加#version 300 es。这种方法会极大地限制兼容的 Android 设备。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    相关资源
    最近更新 更多