繁体   English   中英

舞台中的Libgdx着色器?

[英]Libgdx shaders in a Stage?

在libgdx中,我加载了一个着色器,并且我想使我的Stage对象使用该着色器进行绘制。 我尝试将SpriteBatch的着色器设置为我的着色器,然后将Stage的sprite批处理设置为该着色器,但是它显示为黑屏。 为什么这样不起作用:

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不会产生任何影响。

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

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

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

我无法解释为什么您所做的会使用其中一种纹理。 我希望它可以将所有内容绘制为与纹理的左下像素相同的颜色。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM