2015-11-01 8 views
10

मैं 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(); 
+1

आपने पर्याप्त जानकारी प्रदान नहीं की थी http://stackoverflow.com/help/how पर एक नजर है:

अंत में यहाँ

कोड मैं सही टुकड़ा शेडर को निर्देशांक देने के लिए इस्तेमाल करते हैं पूछने के लिए और विशेष रूप से 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