2013-04-21 16 views
5

में कैमरा विमान की दूरी के रूप में गहराई मेरे पास जीएलएसएल शेडर्स की एक जोड़ी है जो मुझे मेरे दृश्य में वस्तुओं का गहराई का नक्शा देती है। अब मुझे जो मिलता है वह प्रत्येक पिक्सेल से कैमरे की दूरी है। मुझे पिक्सेल से कैमरे के विमान तक दूरी प्राप्त करने की आवश्यकता है। मुझे थोड़ा ड्राइंगजीएलएसएल

*   |--* 
/   | 
/   | 
C-----*  C-----* 
\   | 
    \   | 
    *   |--* 

3 तारांकन पिक्सल हैं और सी कैमरा है। तारों से रेखाएं "गहराई" हैं। पहले मामले में, मुझे पिक्सेल से कैमरे की दूरी मिलती है। दूसरे में, मैं प्रत्येक पिक्सेल से विमान तक दूरी प्राप्त करना चाहता हूं।

कुछ प्रोजेक्शन मैट्रिक्स का उपयोग करके ऐसा करने का एक तरीका होना चाहिए, लेकिन मैं स्टंप हो गया हूं।

यहां दिए गए शेडर्स हैं जिनका मैं उपयोग कर रहा हूं। ध्यान दें कि eyePosition camera_position_object_space है।

शीर्ष shader:

void main() { 
    position = gl_Vertex.xyz; 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
} 

पिक्सेल Shader:

uniform vec3 eyePosition; 
varying vec3 position; 


void main(void) { 
     vec3 temp = vec3(1.0,1.0,1.0); 
     float depth = (length(eyePosition - position*temp) - 1.0)/49.0; 
     gl_FragColor = vec4(depth, depth, depth, 1.0); 
} 
+0

प्रक्षेपण किस तरह का प्रयोग कर रहे हैं: आप इस के लिए एक अलग modelview और प्रक्षेपण मैट्रिक्स का उपयोग करने की जरूरत नहीं है? यदि आप गहराई के मानचित्र को प्रस्तुत करते समय ऑर्थोग्राफिक प्रक्षेपण का उपयोग करते हैं, तो आपको किसी भी गणना के बिना जो चाहिए उसे प्राप्त करना चाहिए। – Ani

+0

मैं प्रतिपादन करते समय परिप्रेक्ष्य प्रक्षेपण कर रहा हूं, लेकिन मुझे ऑर्थोग्राफिक प्रक्षेपण से आने वाले गहराई मूल्यों की आवश्यकता है। विस्तृत प्रतिक्रिया के लिए – Lucian

उत्तर

9

आप वास्तव में इसे कठिन तरीके से करने की कोशिश कर रहे हैं। बस चीजों को कैमरे की जगह में बदल दें, और वहां से काम करें।

varying float distToCamera; 

void main() 
{ 
    vec4 cs_position = glModelViewMatrix * gl_Vertex; 
    distToCamera = -cs_position.z; 
    gl_Position = gl_ProjectionMatrix * cs_position; 
} 

कैमरा अंतरिक्ष में (जगह है जहाँ सब कुछ कैमरा की स्थिति/उन्मुखीकरण के सापेक्ष है), एक शीर्ष करने के लिए समतल दूरी सिर्फ जेड के नकारात्मक समन्वय है (उच्च नकारात्मक जेड दूर है)।

तो आपके टुकड़े के शेडर को eyePosition की आवश्यकता भी नहीं है; "गहराई" सीधे कशेरुक शेडर से आता है।

+0

आप सही हैं, मैं इसे कठिन तरीके से कर रहा था। साथ ही, मुझे लगता है कि -cs.z is -cs_position.z है। कोड स्निपेट के लिए धन्यवाद! – Lucian

1

क्या आप की ओर इशारा कर रहे हैं वर्तनी विषयक प्रक्षेपण है। आप वर्तमान में परिप्रेक्ष्य प्रक्षेपण का उपयोग कर रहे हैं। असल में आपके पास पिक्सेल से कैमरे तक वास्तविक दूरी नहीं है, बल्कि फ्रेस्टम में पिक्सेल की जेड स्थिति है। प्रस्तुत किए गए बनावट पर [-1,1] की सीमा में अंतिम जेड गहराई प्रदान की जाती है, जो एनडीसी अंतरिक्ष में इसके जेड घटक का वर्णन करती है।

जैसा कि आप समझते हैं, आपके सभी बिंदुओं को परिप्रेक्ष्य प्रक्षेपण का उपयोग कर कैमरे को 'दिशा' (वास्तव में निकटतम विमान पर) पेश किया जाता है। आप जो चाहते हैं वह निकटतम विमान की ओर ऑर्थोग्राफिक रूप से प्रोजेक्ट करना है। This link दोनों प्रक्षेपण मैट्रिक्स का विस्तार से वर्णन करता है, और matrices के अंतिम परिणाम नीचे हैं। आपके शेडर्स नए प्रोजेक्शन मैट्रिक्स को ठीक से संभालने में सक्षम होना चाहिए। बस सुनिश्चित करें कि ऊपर दिए गए अनुसार आपके एमवीपी मैट्रिक्स की गणना की गई है।

नोट ऑर्थोग्राफिक प्रक्षेपण शायद आपके प्रस्तुत दृश्य की गहराई का प्रतिनिधित्व नहीं करता है। यदि आप अपने दृश्य को एक परिप्रेक्ष्य प्रक्षेपण के साथ स्क्रीन पर प्रस्तुत कर रहे हैं, और आप प्रत्येक पिक्सेल की गहराई को देखना चाहते हैं, तो आपको तदनुसार उसी परिप्रेक्ष्य प्रक्षेपण का उपयोग करना चाहिए। तो ऑर्थोग्राफिक प्रक्षेपण का उपयोग करके अपनी गहराई को प्रस्तुत करना केवल तभी उपयोगी होगा जब आपका दृश्य समान प्रक्षेपण का उपयोग करता हो, या यदि कुछ एल्गोरिदम को स्क्रीन पर दिखाई देने वाले दृश्य से गहराई से जानकारी की गहराई की आवश्यकता होती है।

इसके अलावा मैं कोर ओपनजीएल प्रोफाइल (3.x) पर एक नज़र डालने का सुझाव देता हूं क्योंकि आप बहिष्कृत कार्यक्षमता (gl_Vertex, gl_ModelViewProjectionMatrix और समान रूप से) का उपयोग कर रहे हैं। यह सभी बफर और शेडर्स को स्वयं स्थापित करने के लिए थोड़ा और काम है, लेकिन यह अंत में भुगतान करता है।

संपादित

वास्तव में, आपकी टिप्पणी के बाद, मैं समझता हूँ कि आप क्या चाहते। यह स्पष्ट नहीं था कि आप इस के लिए मैं अपने टुकड़ा शेडर में कुछ इस तरह का सुझाव उन्हें एक ही कॉल में प्रस्तुत करना चाहते थे,:

uniform mat4 orthographicMatrix; 
varying vec3 position; 

void main(void) { 
     vec4 clipSpace = orthographicMatrix * vec4(position, 1.0); 
     gl_FragColor = vec4(clipSpace.zzz, 1.0); 
} 

नोट आप के रूप में वर्तनी विषयक प्रक्षेपण है w विभाजित करने के लिए की जरूरत नहीं है रैखिक पहले से ही (इस प्रकार डब्ल्यू 1 पर सेट है)।

+0

धन्यवाद। परिप्रेक्ष्य प्रक्षेपण के अनुसार प्रतिपादन करते समय मैं _th_ ऑर्थोगोनल प्रक्षेपण से संबंधित गहराई प्राप्त करने की कोशिश कर रहा हूं। यह अजीब लग सकता है लेकिन मुझे यही करना है। – Lucian

+0

ओह, मैं देखता हूं, मुझे लगता है कि मैं समझता हूं कि आपका क्या मतलब है। मेरी पोस्ट संपादित की। – Invalid

1

प्रक्षेपण के बाद डब्ल्यू घटक दृश्य में ऑर्थोगोनल गहराई शामिल है।

varying float distToCamera; 

void main() 
{ 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
    distToCamera = gl_Position.w; 
} 
+0

क्या यह है? क्या यह 'gl_Position.z/gl_Position.w' नहीं है? – RecursiveExceptionException

संबंधित मुद्दे