मैं एक कपड़ा सिमुलेशन के लिए जीपीयू के साथ कुछ काम करने की कोशिश कर रहा हूं और मुझे विभिन्न हार्डवेयर के साथ कुछ समस्याएं आ रही हैं। मैं ढांचे के रूप में तीनjs का उपयोग कर रहा हूं, लेकिन मेरा मानना है कि मेरे पास होने वाली समस्या के लिए प्रासंगिक नहीं है।जीएलएसएल मैट्रिक्स/उलटा गुणा सटीक
मूल रूप से मैं जो करता हूं वह है कि मैं मैट्रिक्स और उस मैट्रिक्स के विपरीत को स्थानीय कोरों से दुनिया में बदलने के लिए, दुनिया के तारों (टक्कर का पता लगाने जैसे) में कुछ गणित करता हूं, और फिर उन्हें स्थानीय रूप में बदल देता हूं। यह मेरा लैपटॉप पर अच्छा काम करता है जब मैं चल बिन्दु बनावट का उपयोग कर रहा है, तथापि मैं अपने फ़ोन पर देखा कुछ विचित्र कलाकृतियों देखते हैं:
सही:
गलत:
कुछ डिबगिंग मेरे पास करने के बाद इसे दो समस्याओं तक सीमित कर दिया। उनमें से दोनों दशमलव परिशुद्धता से संबंधित हैं। मैट्रिक्स गुणा और उलटा उपयोग करते समय बाधाओं (और बाधाओं के दौरान परिशुद्धता की समस्या) और परिशुद्धता खोने के कारण शिखरों का ढहना।
कारण मुझे विश्वास है कि समस्या परिशुद्धता से संबंधित है क्योंकि अगर मैं एक फ्लोटिंग पॉइंट बनावट का उपयोग करता हूं तो यह मेरे कंप्यूटर पर काम करता है, लेकिन अगर मैं आधे फ्लोट का उपयोग करता हूं तो मुझे भी यही समस्याएं होती हैं। मेरा फोन फ्लोटिंग पॉइंट बनावट का समर्थन करता है जो एक कारण है कि मैं इस बारे में उलझन में हूं कि यह मेरे फोन पर क्यों होगा। मैंने समस्या को कम कर दिया ताकि सभी कपड़े सिमुलेशन अक्षम हो जाएं और यदि मैं बिना किसी गुरुत्वाकर्षण के अपने कंप्यूटर पर आधे फ्लोट बनावट के साथ एप्लिकेशन चलाता हूं लेकिन अजीब तरीकों से विमान के प्रकार के झटके के विपरीत और उलटा तरीके से
जबकि परिवर्तन और उलटा अक्षम है तो यह सामान्य दिखता है।
मैं इस समस्या को संभालने के लिए विचारों से बाहर हूं हालांकि या यदि मैं सही रास्ते पर भी जा रहा हूं। मेरा मानना है कि आधा फ्लोट बनावट में दशमलव परिशुद्धता सीमित है लेकिन मुझे समझ में नहीं आ रहा है कि इससे मेरी समस्याएं क्यों पैदा होंगी क्योंकि इससे केवल शेडर के उत्पादन को प्रभावित करना चाहिए, न कि गणित में गणित चल रहा है।
' vec2 cellSize = 1.0/res;',
' vec4 pos = texture2D(vertexPositions, vuv.xy);',
' vec2 newUV;',
' if(type == 0.0){',
' float px = floor(vuv.x * res.x);',
' float spacingx = px- (2.0 * floor(px/2.0));',
' float py = floor(vuv.y * res.y);',
' float spacingy = py- (2.0 * floor(py/2.0));',
' float total = spacingx + spacingy;',
' total = total- (2.0 * floor(total/2.0));',
' if(total == 0.0){',
' newUV = vuv + (direction * cellSize);',
' }',
' else{',
' newUV = vuv - (direction * cellSize);',
' }',
' }',
' if(type == 1.0){',
' float px = floor(vuv.x * res.x);',
' float spacingx = px- (2.0 * floor(px/2.0));',
' float total = spacingx;',
' if(total == 0.0){',
' newUV = vuv + (direction * cellSize);',
' }',
' else{',
' newUV = vuv - (direction * cellSize);',
' }',
' }',
' vec4 totalDisplacement = vec4(0.0);',
' if(newUV.x > 0.0 && newUV.x < 1.0 && newUV.y > 0.0 && newUV.y < 1.0){ ',
' vec4 posOld = texture2D(vertexPositionsStart, vuv);' ,
' vec4 posOld2 = texture2D(vertexPositionsStart, newUV);' ,
' float targetDistance = length(posOld - posOld2);',
' vec4 newPos = texture2D(vertexPositions, newUV);',
' float dx = pos.x - newPos.x;',
' float dy = pos.y - newPos.y;',
' float dz = pos.z - newPos.z;',
' float distance = sqrt(dx * dx + dy * dy + dz * dz);',
' float difference = targetDistance- distance;',
' float percent = difference/distance/2.0;',
' float offsetX = dx * percent * rigid;',
' float offsetY = dy * percent * rigid;',
' float offsetZ = dz * percent * rigid;',
' totalDisplacement.x += offsetX;',
' totalDisplacement.y += offsetY;',
' totalDisplacement.z += offsetZ;',
' }',
' }',
' }',
' pos += totalDisplacement;',
' if( vuv.x > 1.0 - cellSize.x && topConstrain == 1){',
' pos =transformation * texture2D(vertexPositionsStart, vuv.xy);',
' }',
' if( vuv.x < cellSize.x && bottomConstrain == 1){',
' pos =transformation * texture2D(vertexPositionsStart, vuv.xy);',
' }',
' if( vuv.y < cellSize.y && leftConstrain == 1){',
' pos =transformation * texture2D(vertexPositionsStart, vuv.xy);',
' }',
' if( vuv.y > 1.0 - cellSize.y && rightConstrain == 1){',
' pos =transformation * texture2D(vertexPositionsStart, vuv.xy);',
' }',
' gl_FragColor = vec4(pos.xyz , 1.0);',
जीएलएस के लिए सटीक आवश्यकताओं डेस्कटॉप जीएल (विशेष रूप से जब आप GLES2 के साथ काम करते हैं) के मुकाबले बहुत कम हैं। यह आपकी मदद नहीं करता है अगर आप पूर्ण fp32 बनावट का उपयोग करते हैं जब आपके शेडर एएलयू अभी भी बहुत कम परिशुद्धता का उपयोग करते हैं। – derhass
मैं देखता हूं। तो आपको लगता है कि समस्या यह है कि मेरे फोन के शेडर एएलयू पर्याप्त परिशुद्धता का समर्थन नहीं करते हैं। मुझे समझ में नहीं आ रहा है कि अगर मैं अपने कंप्यूटर पर आधा फ्लोट बनावट का उपयोग करता हूं तो यह समस्या अभी भी क्यों होगी। यह एक उचित स्पष्टीकरण की तरह प्रतीत होता है हालांकि –
** सापेक्ष समन्वय प्रणाली ** का उपयोग करने का प्रयास करें, इसलिए परिवर्तित किए गए कशेरुक आपके [matrices origins] से बहुत दूर नहीं हैं (https://stackoverflow.com/questions/28075743/how-do- i-रचना-ए-रोटेशन-मैट्रिक्स-साथ-मानव पठनीय-कोण-से-खरोंच/28084380 एस = 1 |? 64.0697 # 28084380)।गणना के बाद मूल समन्वय प्रणाली में वापस अनुवाद करें। इस तरह आप matrices के साथ उच्च आवर्धन वैक्टर गुणा का उपयोग करने से बचेंगे जो सटीकता की समस्या पैदा करता है। अधिक जानकारी के लिए देखें [रे और एलिप्सिड चौराहे सटीकता सुधार] (https://stackoverflow.com/q/25470493/2521214) – Spektre