libGDX着色器坐标和相机位置

11

我正在使用libGDX、Tiled Map和Box2D制作一个平台游戏。我想应用一些着色器。

我想要一个呈现在英雄身上的晕影效果。对于晕影效果,我使用了这个教程。 我遇到的问题是:如果相机是固定的,我可以得到我想要的效果。晕影效果会贴在英雄身上。但是,如果相机移动,这在滚动平台游戏中经常发生,晕影效果就不会贴在英雄身上。

以下是演示我的问题的视频

看来我需要考虑相机位置来计算晕影效果的坐标,但我不知道该怎么做。 以下是我用于晕影效果的片段着色器:

varying vec4 v_color;   
varying vec2 v_texCoord0;

uniform vec2 u_resolution;
uniform float u_PosX, u_PosY;
uniform sampler2D u_sampler2D;  

const float outerRadius = 10, innerRadius = 1, intensity = .5;

void main(){
    vec4 color = texture2D(u_sampler2D, v_texCoord0) * v_color;

    vec2 relativePosition = gl_FragCoord.xy / u_resolution - vec2(u_PosX, u_PosY); //Position of the vignette
    relativePosition.x *= u_resolution.x / u_resolution.y;  //The vignette is a circle
    float len = length(relativePosition);
    float vignette = smoothstep(outerRadius, innerRadius, len);
    color.rgb = mix(color.rgb, color.rgb * vignette, intensity);

    gl_FragColor = color;
}
在游戏屏幕中,相关的代码为:
public TestScreen(final MyGdxGame gam){    

    camera = new MyCamera(); 
    camera.setToOrtho(false, width, height);
    camera.update();

    vertexShader = Gdx.files.internal("Shaders/vVignette.glsl").readString();
    fragmentShader = Gdx.files.internal("Shaders/fVignette.glsl").readString();
    shaderProgram = new ShaderProgram(vertexShader,fragmentShader);

    shaderProgram.begin();
    shaderProgram.setUniformf("u_resolution", camera.viewportWidth, camera.viewportHeight);
    shaderProgram.end();            
}


public void render(float delta) {
    Gdx.gl.glClearColor(0.1f,0.1f,0.1f,1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    camera.update();

    //calculation of the position of the effect depending on the position of the hero
    posX = (Gdx.graphics.getWidth()/camera.viewportWidth) * hero.bodyHero.getPosition().x/camera.viewportWidth;
    posY = (Gdx.graphics.getHeight()/camera.viewportHeight) * hero.bodyHero.getPosition().y/camera.viewportHeight;  

    shaderProgram.begin();
    shaderProgram.setUniformf("u_PosX", posX);
    shaderProgram.setUniformf("u_PosY", posY);
    shaderProgram.end();
}

正如我所说,如果相机不移动,这段代码完美运行。但是由于相机移动时无法正常工作,我认为问题与相机投影有关,并在render()中尝试了这段代码,但仍然没有更好的结果。

Vector3 PosHero = new Vector3();
PosHero.set(hero.bodyHero.getPosition().x, hero.bodyHero.getPosition().y, 0);
camera.unproject(PosHero);

posX = (Gdx.graphics.getWidth()/camera.viewportWidth) * PosHero.x/camera.viewportWidth;
posY = (Gdx.graphics.getHeight()/camera.viewportHeight) * PosHero.y/camera.viewportHeight;

shaderProgram.begin();
shaderProgram.setUniformf("u_PosX", posX);
shaderProgram.setUniformf("u_PosY", posY);
shaderProgram.end();

1
您没有提供足够的信息,请查看http://stackoverflow.com/help/how-to-ask,特别是http://stackoverflow.com/help/mcve。 - Xoppa
1个回答

7

天哪...我已经在这个问题上苦苦挣扎了近2周,而我的问题只是一个简单的错误:

问题就像我所想的那样与相机投影有关。在我消息末尾提供的代码中,我使用了camera.unproject(PosHero);,但实际上我需要使用camera.project(PosHero);

最后,这里是我用来将正确坐标提供给片段着色器的代码:

Vector3 PosHero = new Vector3();
PosHero.set(hero.bodyHero.getPosition().x, hero.bodyHero.getPosition().y, 0);
camera.project(PosHero);

posX = PosHero.x/camera.viewportWidth;
posY = PosHero.y/camera.viewportHeight;

shaderProgram.begin();
shaderProgram.setUniformf("u_PosX", posX);
shaderProgram.setUniformf("u_PosY", posY);
shaderProgram.end();

好吧...一个讨厌的人在没有给出任何解释的情况下,对我的问题和回答进行了负评。这种懦弱的行为真是可耻。 - vdlmrc
通常情况下,我会说这要么是因为他们想要获取你的赏金,要么是因为这是一种简单的用户输错类型的错误 - 因此可能被认为对该网站没有用处(因为如果每个人都有其打字错误的变体,那么在这里找到好的信息将会很困难),但我个人认为,考虑到您发布的代码和细节数量,这没什么大不了的。我只会忽略它。 - DoubleDouble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接