2015-11-01 16 views
10

私は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(); 
+1

http://stackoverflow.com/help/howを見て:最後にここに

は、私は、フラグメントシェーダに右の座標を与えるために使用するコードです-to-ask、特にhttp://stackoverflow.com/help/mcveを参照してください。 – Xoppa

答えて

6

OMG ..私はこれでほぼ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(); 
+0

まあ...この臆病な行動に説明を与えずに、私の質問と私の答えを下落させたのは、 – vdlmrc

+0

通常は、あなたの賞金を欲しかったのか、それともシンプルなユーザーのタイプミスであったからだと思います - そして、サイトには役に立たないと思われるかもしれません。ここでは良い情報を見つけるために*)、私は個人的にコードの量とあなたが投稿した細部は大丈夫だと思います。私はちょうどそれを無視するだろう。 – DoubleDouble

関連する問題