जैसी कोई चीज है, इसलिए, मैं जीएलएसएल और जीएलएम के बीच कुछ विषमताओं में आया हूं।जीएलएसएल और जीएलएम के बीच मैट्रिक्स गणित के साथ असंगतता, या "खराब" दृश्य मैट्रिक्स
अगर मैं निम्न दृश्य मैट्रिक्स (C++) उत्पन्न:
vec3 pos(4, 1, 1);
vec3 dir(1, 0, 0);
mat4 viewMat = glm::lookAt(pos, pos+dir, vec3(0,0,1));
और फिर, GLSL में, कार्य करें:
fragColour.rgb = vec3(inverse(viewMat) * vec4(0,0,0,1))/4.f;
तो मैं स्क्रीन गुलाबी-लाल बनने के लिए उम्मीद, या (1.0,0.25,0.25)। इसके बजाय, मुझे काला मिलता है।
अगर मैं GLM में ऐसा करते हैं, तथापि:
vec3 colour = vec3(glm::inverse(viewMat) * vec4(0,0,0,1))/4.f;
cout << glm::to_string(colour) << endl;
मैं (1.0,0.25,0.25) का परिणाम उम्मीद मिलता है।
अब, अगर मैं viewMat बदलने के बजाय होने के लिए (C++):
vec3 pos(4, 1, 1);
vec3 dir(1, 0.000001, 0);
mat4 viewMat = glm::lookAt(pos, pos+dir, vec3(0,0,1));
फिर
bam! मुझे जीएलएसएल और जीएलएम दोनों में (1.0,0.25,0.25) मिलता है।
इससे मुझे कोई समझ नहीं आता है। यह ऐसा क्यों करता है? यह दृश्य मैट्रिक्स जीएलएसएल में हर जगह ठीक काम करता है - मैं बस इसे उलटा नहीं कर सकता। ऐसा होता है जब भी dirY == 0.f।
इसके अलावा, कृपया प्रश्न शीर्षक के लिए सुधार का सुझाव दें, मुझे यकीन नहीं है कि यह क्या होना चाहिए।
संपादित करें: इसके अलावा, ऐसा लगता है कि यह ऊपर की ओर वेक्टर (जिसे मैं वैसे भी ज़ेड पर सेट करता हूं) के साथ कुछ भी नहीं करना प्रतीत होता है। यहां तक कि अगर मैं (0,1,0) तक सेट करता हूं, वही होता है। सबकुछ किनारे पर जाता है, लेकिन मैं अभी भी जीएलएसएल में दृश्य मैट्रिक्स को उलटा नहीं कर सकता।
संपादित करें: ठीक है, तो डरहास के सुझाव पर, मैंने दृश्य मैट्रिक्स को पहले से उलटा करने की कोशिश की। बम, पूरी तरह से काम करता है। तो, ऐसा लगता है कि मेरा जीएल कार्यान्वयन वास्तव में उस मैट्रिक्स को बदलने में असमर्थ है। यह कभी भी अजीब जीएल बग होना चाहिए जो मैंने कभी पार किया है। शेडरों में मैट्रिस को उलटा करने का बुरा विचार क्यों है, इस बारे में कुछ स्पष्टीकरण की सराहना की जाएगी। एडिटएजैन: पूरे इंजन में उलटा मैट्रिस भेजना जिसके परिणामस्वरूप एक बड़ा फ्रेमरेट बढ़ावा हुआ। निश्चित रूप से ऐसा करो।
ठीक है, जहां तक मैं कह सकता हूं, यह मुद्दा पूरी तरह से ग्लम के लिए अनियंत्रित है। ऐसा लगता है कि यह जीएलएसएल में उलझाने में सिर्फ एक समस्या है। जिस तरह से आपका मैट्रिक्स स्थापित होता है, यह पूरी तरह से उलटा होना चाहिए, और संख्यात्मक मुद्दों को कोई समस्या नहीं होनी चाहिए। यह आपके जीएल कार्यान्वयन के साथ एक मुद्दा हो सकता है। यह भी ध्यान रखें कि शेडर में इनवर्टर मैट्रिस ज्यादातर मामलों में एक बुरा विचार है, लेकिन यह निश्चित रूप से काम करना चाहिए। यदि संभव हो तो मैं कुछ अन्य जीएल लागू करने के साथ इसका परीक्षण करने की सलाह देता हूं। – derhass
@derhass Ahhh, मैं पहले से उलटा मैट्रिक्स में भेजने पर विचार नहीं किया था। मैं कोशिश करूँगा। मैं यह भी देखने की कोशिश करूंगा कि समस्या कहीं और भी होती है या नहीं। मैं इस समय एक काफी पुराने एनवीडिया ड्राइवर (उबंटू 14.04 के रेपो में से एक) का उपयोग कर रहा हूं। – Jagoly
यह पहली बार था जब मैंने सीखा कि जीएलएसएल में अब एक व्यस्त कार्य है। यह निश्चित रूप से एक जीपीयू अनुकूल संचालन नहीं है। हमेशा संचालन के पदानुक्रम से अवगत रहें: प्रति ड्रॉ, प्रति चरम, प्रति खंड। हमेशा जितनी कम हो सके सामान को ले जाएं। आप उलटा प्रति वर्टेक्स करके बस एक बहुत ही असंभव कोड पथ मारा। यह भी ध्यान रखें कि एक सामान्य उलटा आमतौर पर आवश्यक नहीं है। अधिकांश मॉडल व्यू मैट्रिस "ऑर्थो सामान्य" होना चाहिए। जहां उलटा स्थानांतरण के समान है। – starmole