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