मैं libGDX, टाइल किए गए मानचित्र और 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 पर एक नजर है:
अंत में यहाँकोड मैं सही टुकड़ा शेडर को निर्देशांक देने के लिए इस्तेमाल करते हैं पूछने के लिए और विशेष रूप से http://stackoverflow.com/help/mcve। – Xoppa