2010-12-26 14 views
6

पर बनावट डेटा लिखना मैं Compositing Images with Depth पर वर्णित तकनीक को लागू करने की कोशिश कर रहा हूं।गहराई बफर

विचार मूल रूप से नकली 3 डी के लिए गहराई मुखौटा के रूप में एक मौजूदा बनावट (छवि से लोड) का उपयोग करना है।

मुझे जिस समस्या का सामना करना पड़ता है वह है कि glDrawPixels OpenglES में उपलब्ध नहीं है। क्या आईफोन पर एक ही चीज़ को पूरा करने का कोई तरीका है?

उत्तर

7

ओपनजीएल ईएस में आपके विचार से गहराई बफर अधिक अस्पष्ट है; न केवल glDrawPixels अनुपस्थित है, लेकिन gl_FragDepth को जीएलएसएल से हटा दिया गया है। तो आप गहराई बफर पर स्पूल मानों को स्पूल करने के लिए एक कस्टम खंड शेडर नहीं लिख सकते क्योंकि आप रंगों को धक्का दे सकते हैं।

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

नुकसान यह है कि ड्राइंग आपको एक अतिरिक्त बनावट इकाई खर्च करेगी और बनावट पूर्णांक घटकों का उपयोग करेगी।

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

void main() 
{ 
    // write a value to the depth map 
    gl_FragColor = vec4(gl_FragCoord.w, 0.0, 0.0, 1.0); 
} 

लाल चैनल में दुकान गहराई के लिए। तो आपने आंशिक रूप से पुरानी गहराई बनावट विस्तार को फिर से बनाया है - आपके पास एक ऐसी छवि होगी जिसमें पिक्सेल में चमकदार लाल हो, जो करीब हैं, जो कि आगे के पिक्सेल में एक गहरा लाल है। मुझे लगता है कि आपके प्रश्न में, आप वास्तव में डिस्क से इस छवि को लोड करेंगे।

तो एक भविष्य टुकड़ा शेडर में बनावट का उपयोग करने के लिए, आप की तरह कुछ करना चाहते हैं:

uniform sampler2D depthMap; 

void main() 
{ 
    // read a value from the depth map 
    lowp vec3 colourFromDepthMap = texture2D(depthMap, gl_FragCoord.xy); 

    // discard the current fragment if it is less close than the stored value 
    if(colourFromDepthMap.r > gl_FragCoord.w) discard; 

    ... set gl_FragColor appropriately otherwise ... 
} 

EDIT2: आप एक RGBA मूल्य here को गहराई से एक बहुत होशियार मानचित्रण देख सकते हैं। उस दस्तावेज़ में सीधे जुड़ने के लिए, OES_depth_texture निश्चित रूप से आईपैड या तीसरी पीढ़ी के आईफोन पर समर्थित नहीं है। मैंने कहीं और एक पूर्ण परीक्षण नहीं चलाया है।

+0

आपके उत्तर के लिए धन्यवाद। क्या आप ऑन-जीपीयू राउंड-ट्रिप के बारे में कुछ बता सकते हैं जिसके बारे में आप बात कर रहे हैं? मुझे पूरा यकीन नहीं है कि मैं उस हिस्से को समझता हूं। – sharvey

+0

यह आपके द्वारा पूछे जा रहे प्रश्न के लिए पूरी तरह से प्रासंगिक नहीं है - यह 'प्रश्नोत्तरी के लिए गहराई का नक्शा कैसे उपयोग करें' के लिए अधिक प्रासंगिक है, जहां आप वास्तव में GPU पर गहराई का नक्शा बनाने और मानचित्र को रखने के लिए कुछ आकर्षित करते हैं डिस्क से इसे लोड करने के बजाय बाद में। लेकिन मैंने एक त्वरित उदाहरण कोड जोड़ा है, जो अभी भी थोड़ा अस्पष्ट हो सकता है? – Tommy

+0

वाह, बहुत बहुत धन्यवाद। – sharvey

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

  • कोई संबंधित समस्या नहीं^_^