私はlibGDX、Tiled Map、Box2Dのプラットフォーマーで作業しています。私はいくつかのシェーダーを適用したい。libGDXシェーダの座標とカメラの位置
ヒーローに固執するビネットエフェクトが欲しいです。ビネットエフェクトの場合は、this tutorialを使用しました。 私が遭遇する問題は、カメラが固定されている場合、私が望むものを正確に得ることです。ビネットは主人公に固執する。しかし、スクロールするプラットフォームゲームでカメラが動くと、ビネットエフェクトはヒーローに固執しません。
Here is a video that illustrates my problem
私がビネット効果の座標を計算するために考慮にカメラの位置を取らなければならないが、私はどのように考えているようです。ここで 私はビネットに使用するフラグメントシェーダである:ゲーム画面で
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();
}
私が言ったようにカメラがない場合、このコードは完璧に動作します動くときは、カメラが移動し、それは動作しませんので、しかし、私はレンダリング() で、問題はカメラの投影にリンクされていたと私はノーより良い成功を収めて、このコードを試してみましたと思った:
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();
http://stackoverflow.com/help/howを見て:最後にここに
は、私は、フラグメントシェーダに右の座標を与えるために使用するコードです-to-ask、特にhttp://stackoverflow.com/help/mcveを参照してください。 – Xoppa