2015-11-01 20 views
10

LibGDX, Döndürülmüş Harita ve Box2D ile bir platform üzerinde çalışıyorum. Bazı gölgelendiriciler uygulamak istiyorum.libGDX shader koordinat ve kamera pozisyonu

Kahramana sadık kayan bir skeç efekti istiyorum. Vinyet etkisi için this tutorial kullandım. Karşılaştığım problem: Kamera sabit ise, tam olarak istediğimi elde ederim. Vinyet kahramana yapışır. Ancak, hareket eden bir platform oyunu olan kamera hareket ederse, vinyet etkisi kahramana bağlı kalmaz.

Here is a video that illustrates my problem

Ben hesaba skeç etkisi koordinatı hesaplamak için kamera pozisyon almak zorunda gibi görünüyor, ama ben nasıl hiçbir fikrim yok. İşte Ben skeç için kullanmak parça gölgelendirici geçerli: Oyun ekranında

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; 
} 

, ilgili kod şudur:

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(); 
} 

Dediğim gibi kamera yapmazsa, bu kod mükemmel çalışıyor hareket. kamera hareketleri, ben sorun kamera projeksiyon bağlıydı düşündüm ve render() yılında, daha iyi bir başarı ile, bu kodu çalıştığında Ama çalışmıyor tarihi:

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 de bakabilirsiniz: Son olarak burada

Birazdan parça gölgelendirici koordinatları vermek için kullandıkları koddur -to-ve özellikle http://stackoverflow.com/help/mcve. – Xoppa

cevap

6

OMG .. Bu konuda neredeyse 2 hafta uğraştım ve problemim basit bir hataydı:

Sorun, düşündüğüm gibi, kamera projeksiyonuna bağlıydı. Mesajımın sonunda verdiğim kodda, camera.unproject(PosHero); kullandım, ama bunun yerine camera.project(PosHero); kullanmam gerekiyor! , Yeterli bilgi vermedi

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

Şey ... bir halet benim sorumu ve cevabımı reddetti, bu korkak davranışa bir açıklama yapmadan. – vdlmrc

+0

Normalde, ya kandırmak istedikleri ya da basit bir kullanıcı yazım hatası olduğu için olduğunu söyleyebilirim - ve bu nedenle site için yararlı sayılmayabilir (* çünkü herkes kendi yazım hatalarını çeşitlendirirse Burada iyi bilgi bulmak için *), ancak kişisel olarak yazdığınız kod ve ayrıntı miktarını düşünün. Sadece görmezden gelirim. – DoubleDouble