मुझे अपना खुद का सॉफ्टवेयर 3D रेस्टराइज़र लिखना होगा, और अब तक मैं अपने 3D मॉडल को त्रिभुजों से बना कर प्रोजेक्ट में सक्षम कर रहा हूँ:
मैं प्रत्येक त्रिभुज का 2d स्थान प्रतिनिधित्व प्राप्त करने के लिए अपने बिंदुओं को घुमाता हूं, अनुवाद करता हूं और प्रोजेक्ट करता हूं। फिर, मैं 3 त्रिभुज बिंदु लेता हूं और मैं सभी बिंदुओं को खोजने के लिए स्कैनलाइन एल्गोरिथ्म (रैखिक प्रक्षेप का उपयोग करके) को लागू करता हूं [x] [y] त्रिकोण के किनारों (बाएं और दाएं) के साथ, ताकि मैं त्रिभुज को क्षैतिज रूप से स्कैन कर सकूं, पंक्ति से पंक्ति, और इसे पिक्सेल से भरें।
यह काम। सिवाय मुझे z- बफरिंग लागू करने के भी। इसका मतलब है कि त्रिकोण के 3 कोने के घुमाए गए और अनुवादित z निर्देशांक को जानने के बाद, मुझे अपने स्कैनलाइन एल्गोरिथ्म के साथ मिलने वाले अन्य सभी बिंदुओं के लिए z समन्वय को प्रक्षेपित करना होगा।
अवधारणा पर्याप्त स्पष्ट लगती है, मैं पहली बार ज़ा और जेडबी को इन गणनाओं के साथ देखता हूं:
var Z_Slope = (bottom_point_z - top_point_z) / (bottom_point_y - top_point_y);
var Za = top_point_z + ((current_point_y - top_point_y) * Z_Slope);
फिर प्रत्येक Zp के लिए मैं एक ही प्रक्षेप क्षैतिज रूप से करता हूं:
var Z_Slope = (right_z - left_z) / (right_x - left_x);
var Zp = left_z + ((current_point_x - left_x) * Z_Slope);
और यदि वर्तमान z उस सूचकांक पर पिछले z की तुलना में दर्शक के करीब है, तो रंग को रंगीन बफर में लिखें और z z को बफर में नया लिखें। (मेरा समन्वय प्रणाली x है: बाएँ -> दाएँ; y: शीर्ष -> नीचे; z: आपका चेहरा -> कंप्यूटर स्क्रीन;)
समस्या यह है, यह haywire जाता है। यह परियोजना यहां है और यदि आप "Z-Buffered" रेडियो बटन का चयन करते हैं, तो आपको परिणाम दिखाई देंगे ... ( ध्यान दें कि मैं "Z-Buffered" मोड में चित्रकार के एल्गोरिथ्म का उपयोग करता हूं (-only- वायरफ्रेम खींचने के लिए) डिबगिंग उद्देश्यों के लिए )
पुनश्च: मैंने यहाँ पढ़ा है कि आप को z = 1/z
प्रक्षेप करने से पहले z को उनके पारस्परिक (अर्थ ) में बदल देना चाहिए । मैंने कोशिश की है, और ऐसा लगता है कि कोई बदलाव नहीं है। मैं क्या खो रहा हूँ? (कोई भी स्पष्ट कर सकता है, ठीक है जहां आपको z को 1 / z में बदलना चाहिए और जहां (यदि) उसे वापस चालू करना है?)
[संपादित करें] यहां मुझे अधिकतम और न्यूनतम z मानों के बारे में कुछ डेटा दिए गए हैं:
max z: 1; min z: -1; //<-- obvious, original z of the vertices of the triangles
max z: 7.197753398761272; min z: 3.791703256899924; //<-- z of the points that were drawn to screen (you know, after rotation, translation), by the scanline with zbuffer, gotten with interpolation but not 1/z.
max z: 0.2649908532179404; min z: 0.13849507306889008;//<-- same as above except I interpolated 1/z instead of z.
//yes, I am aware that changing z to 1/z means flipping the comparison in the zBuffer check. otherwise nothing gets drawn.
इससे पहले कि मैं श्रमसाध्य डिबगिंग में जाऊं, क्या कोई पुष्टि कर सकता है कि मेरी अवधारणा अब तक सही है?
[EDIT2]
मैंने z- बफ़रिंग को हल किया है। जैसा कि यह पता चला है, ड्राइंग ऑर्डर बिल्कुल गड़बड़ नहीं था। Z निर्देशांक की सही गणना की जा रही थी।
समस्या यह थी कि अपने फ्रेम दर को बढ़ाने के प्रयास में, मैं स्क्रीन पर वास्तविक पिक्सेल के बजाय हर 4 पिक्सेल को 4px / 4px बक्से खींच रहा था। इसलिए मैं 16 पिक्सेल प्रति पिक्सेल खींच रहा था, लेकिन उनमें से केवल एक के लिए z बफर की जाँच कर रहा था। मैं ऐसा उल्लू हूँ।
टीएल / डीआर: सवाल अभी भी खड़ा है: आपको जेड के बजाय जेड (1 / जेड में) के पारस्परिक उपयोग का उपयोग कैसे / क्यों / कब करना है? क्योंकि अभी, सब कुछ या तो काम करता है। (कोई ध्यान देने योग्य अंतर नहीं है)।