ताना मारने के वास्तविक गणित के लिए, यह बहुत जटिल हो सकता है, आप यहां क्यों नहीं शुरू करते हैं? ।
अब मैं इस बारे में बात करूँगा कि आप इसे कैसे लागू कर सकते हैं, यह मानते हुए कि आपको पहले से ही गणित मिल गया है कि आप अपने विकृति को कैसे कम करेंगे।
2 तरीके:
1) हर फ्रेम, सिलेंडर मॉडल में प्रत्येक शीर्ष पर जाएँ और इसे किसी तरह से ऑफसेट करें।
2) जब आप प्रतिपादन कर रहे हों , तो वर्टिश शैडर में कोने को बंद करें । ओपनजीएल ईएस 2.0 वर्टेक्स शेड्स का समर्थन करता है। तो तुम भाग्य में हो, एक तरह से।
क्या आप स्क्रीन पर दिखाई देने वाली वस्तु को केवल ताना देना चाहते हैं , या क्या आप वस्तु को ताना देना चाहते हैं ताकि खेल की प्रत्येक वस्तु को पता चले कि यह विकृत हो गया है?
यदि आप वस्तु को वर्टिकल शेडर में ताना देते हैं, तो यह केवल प्रदर्शन / रेखापुंज के तुरंत पहले होता है , तो इसका मतलब है कि गेम की कोई भी वस्तु विरूपण के बारे में नहीं जानती है । यह ठीक है अगर आप बस स्क्रीन सेवर बना रहे हैं, या यदि विकृति इतनी छोटी है कि उनका वस्तु के टकराने योग्य आकार पर कोई प्रभाव नहीं पड़ता है।
जब आप शीर्ष में ज्यामिति को गर्म करते हैं तो वास्तव में मॉडल के मूल कोने हिलते नहीं हैं , (वे केवल स्थानांतरित करने के लिए दिखाई देते हैं )।
वर्टेक्स शेडर में विकृति
undeformed:
विकृत
यह cg ट्यूटोरियल के चैप्टर 6 से है , (प्रोग्राम # 14)।
इस विरूपण का उत्पादन करने के लिए shader कोड कुछ इस तरह है
// choose a displacement amount
float displacement = scaleFactor * 0.5 * sin(position.y * frequency * time) + 1 ;
// displace it in the direction of the normal
float4 displacementDirection = float4(normal.x, normal.y, normal.z, 0) ;
// move the vertex
float4 newPosition = position + displacement * displacementDirection ;
// transform (as normal)
oPosition = mul(modelViewProj, newPosition) ;
तो आप देख सकते हैं, यह RIGHT BEFORE डिस्प्ले (GPU पर वर्टेक्स शेडर होता है) होता है, इसलिए CPU कोड में व्यावहारिक रूप से परिवर्तित शीर्ष स्थान तक पहुंचने का कोई तरीका नहीं होता है (CPU से डेटा भेजने के तरीके मुख्य रूप से बनावट के माध्यम से होते हैं लेकिन हम वहां नहीं जाएंगे)।