हमें z से विभाजित करने के लिए चौथे समन्वय की आवश्यकता क्यों है?


12

मैं यहाँ प्रतिक्रिया पढ़ें:

अंतिम स्थिति के रूप में ग्राफिक्स कार्ड वेक्टर के चौथे तत्व के साथ क्या करता है?

"चौथे घटक परिप्रेक्ष्य प्रक्षेपण का ट्रैक रखने के लिए एक चाल है। जब आप एक परिप्रेक्ष्य प्रक्षेपण करते हैं, तो आप z: x '= x / z, y' = y / z से विभाजित करना चाहते हैं, लेकिन यह एक ऑपरेशन नहीं है जो x, y, z के वेक्टर पर संचालित 3x3 मैट्रिक्स द्वारा कार्यान्वित किया जा सकता है। ऐसा करने के लिए जो चाल मानक हो गई है, उसे चौथे समन्वय, w को जोड़ना है, और यह घोषित करना है कि x, y, z को हमेशा w से विभाजित किया जाएगा। सभी परिवर्तनों को लागू करने और विघटन से पहले। "

लेकिन मुझे समझ नहीं आया कि हम 3x3 मैट्रिक्स का उपयोग करके z को विभाजित क्यों नहीं कर सकते?

क्या हम केवल गुणा नहीं कर सकते

1/z 0 0
0 1/z 0
0 0 1/z

लेना [x/z y/z 1]

?


एक परिवर्तन (या परिवर्तनों की संरचना) को व्यक्त करने का प्रयास करें जिसमें श्रृंखला में कहीं अनुवाद शामिल है। बिना मूल्य के, आप इसे एक मैट्रिक्स में व्यक्त नहीं कर सकते।
DMGregory

मैं अनुवाद का हिस्सा नहीं समझता, लेकिन मुझे समझ में नहीं आया कि चौथे समन्वय को कैसे जोड़ा जाए या मदद मिलेगी या z द्वारा विभाजित करने के लिए एक ट्रिक है

जो आपके लायक है उसके लिए पूरी तरह से वही कर सकते हैं जो आपने कहा था। D से x और y को विभाजित करना 3 डी निर्देशांक से 2 डी स्क्रीन स्पेस में प्रक्षेपण के लिए परिवर्तित करने के लिए एक वैध तरीका है जहां दूर की वस्तुएं छोटी होती हैं। डब्ल्यू अनुवाद करने में सक्षम होने के लिए इसे चौथे आयाम तक ले जाने के लिए एक सजातीय समन्वय है।
एलन वोल्फ

जवाबों:


14

क्योंकि यदि आप केवल आपके [x, y, z]द्वारा विभाजित zकरते हैं [x/z, y/z, 1]और आप वास्तविक मूल्य खो देते हैं z, जो वास्तव में उपयोगी है यदि आप निकट / दूर विमान की कतरन करना चाहते हैं या जेड-बफर भरना चाहते हैं।

zकम से कम GPU के बारे में कुछ जानकारी रखने का सबसे अच्छा तरीका है , इसलिए 3 के बजाय 4 घटकों का उपयोग करना है। व्यवहार में, परिप्रेक्ष्य विभाजन से पहले वास्तव में अंतिम दो वेक्टर घटकों में क्या है, यह किस प्रकार के प्रक्षेपण और प्रभावों पर निर्भर करता है चाहते हैं।

उदाहरण के लिए, एक परिप्रेक्ष्य प्रक्षेपण के मामले में, यह परिणामी 4-घटक वेक्टर है:

| a 0 0 0 |   | x |   |   ax   |
| 0 b 0 0 |   | y |   |   by   |
| 0 0 c d | × | z | = | cz + d |
| 0 0 1 0 |   | 1 |   |    z   |

परिप्रेक्ष्य विभाजित होने के बाद वेक्टर बन जाता है:

|  ax/z   |
|  by/z   |
| c + d/z |
|    1    |

और c + d/zभाग हमें पर्याप्त जानकारी के साथ जेड बफर भरने के लिए छोड़ देता है।


आप केवल X और Y को Z से विभाजित कर सकते हैं, उपज दे सकते हैं [x / z, y / z, z]। GPU को वेक्टर विभाजन नहीं करना पड़ता है , इसे किसी भी गणना करने के लिए डिज़ाइन किया जा सकता है।
user253751

3

तकनीकी रूप से, आप ऐसा कर सकते हैं। लेकिन परेशान क्यों? उस समय तक आपके पास अंतिम z, आप या तो हो सकते हैं:

  • आपके द्वारा वर्णित 3x3 मैट्रिक्स का निर्माण, 9 * sizeof(float)अंतरिक्ष के बाइट को बर्बाद करना , गणना करने के लिए चक्र 1/z(एक विभाजन) खर्च करना और फिर नौ गुणा और छह करना आपके अंतिम शीर्ष को प्राप्त करने के लिए जोड़ता है, या
  • आप तीन डिवीजन कर सकते हैं, जैसा कि वर्तमान में आधुनिक पाइपलाइन करती है

इनमें से एक मेरे लिए कहीं अधिक इष्टतम है, और यह पहला नहीं है। यहां तक ​​कि अगर अनुकूलित हार्डवेयर मैट्रिक्स के लिए कई गुना मौजूद है, जैसा कि यह निश्चित रूप से करता है, यह अभी भी एक साधारण विभाजन की तुलना में वैचारिक रूप से अधिक जटिल है।

इसके अलावा, एक 3x3 मैट्रिक्स एक अनुवाद को सांकेतिक शब्दों में बदलना नहीं कर सकता है, और इसलिए 4x4 मैट्रिक्स (और इस तरह चौथा wसमन्वय) का उपयोग वैसे भी पहले पाइपलाइन में किया जाता है । इसका मतलब है कि आपके पास पहले से ही वह चौथा घटक बैठा है, ताकि आप इसका उपयोग एक उपयोगी मूल्य के परिवहन के लिए कर सकें और इसके साथ अपना विभाजन कर सकें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.