【问题标题】:Libgdx shaders in a Stage?舞台中的 Libgdx 着色器?
【发布时间】:2014-09-28 01:17:45
【问题描述】:

在 libgdx 中,我加载了一个着色器,我想让我的舞台对象使用该着色器进行绘制。我尝试将 SpriteBatch 的着色器设置为我的着色器,然后将舞台的精灵批次设置为那个,但它显示为黑屏。为什么这不起作用:

ShaderProgram shader = new ShaderProgram(Gdx.files.internal("shader.vert"), Gdx.files.internal("shader.frag"));
SpriteBatch batch = new SpriteBatch();
batch.setShader(shader);
Stage stage = new Stage(new StretchViewport(768, 576), batch);
...
stage.act();
shader.begin();
stage.draw();
shader.end();

我的着色器看起来像:

shader.vert

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord;

uniform mat4 u_projTrans;

varying vec4 v_color;
varying vec2 v_texCoords;

void main()
{
    v_color = a_color;
    v_color.a = v_color.a * (256.0/255.0);
    v_texCoords = a_texCoord + 0;
    gl_Position =  u_projTrans * a_position;
}

shader.frag

#ifdef GL_ES
#define LOWP lowp
    precision mediump float;
#else
#define LOWP
#endif

varying LOWP vec4 v_color;
varying vec2 v_texCoords;

uniform sampler2D u_texture;

void main()
{
    gl_FragColor = v_color * texture2D(u_texture, v_texCoords);
}

它似乎只适用于一种纹理。其他所有纹理都不会渲染。而且,将纹理的幂设为 2 并没有什么不同。

【问题讨论】:

    标签: java opengl libgdx shader


    【解决方案1】:

    SpriteBatch 具有某些预期的属性名称。您正在使用 a_texCoord,但它需要 a_texCoord0,因此着色器会将所有 UV 视为 0,0。

    您提到在 SpriteBatch 和舞台的 SpriteBatch 上设置着色器,但在您的代码中,它们是相同的。

    您无需在着色器上调用beginend,因为SpriteBatch(以及Stage)会自动执行此操作。我不确定这是否会导致问题。

    我无法解释为什么你所做的会与你的一种纹理一起工作。我希望它只绘制与纹理左下像素相同的颜色。

    可能还有其他问题,但我假设它在您插入自己的着色器之前绘制正确。

    【讨论】:

    • 首先我的代码与我提到的相同,但我猜我只是措辞不正确。当我删除它们时,开始和结束没有任何区别,但我会尝试将其更改为 a_texCoord0
    • 是的,将a_texCoord 更改为a_texCoord0 就成功了。我不知道为什么,但是我使用的教程是这样写的,但是现在它可以正常工作了,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2021-10-06
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多