2011-02-23 12 views
8

मैंने ओपनजीएल 3 और जीएलएसएल पर गणित संचालन करने के लिए GLM लाइब्रेरी का उपयोग शुरू किया। मैं 2 डी ग्राफिक्स आकर्षित करने के लिए एक वर्तनी विषयक प्रक्षेपण की जरूरत है, तो मैं इस सरल कोड writed: स्क्रीन परglm में मैट्रिक्स मानों का गलत क्रम?

glm::mat4 projection(1.0); 
projection = glm::ortho(0.0f, 640.0f, 480.0f, 0.0f, 0.0f, 500.0f); 

मुद्रण मानों GLM :: ऑर्थो पैदा कर दी है मैं:

0.00313 0.00000 0.00000 0.00000 
0.00000 -0.00417 0.00000 0.00000 
0.00000 0.00000 -0.00200 0.00000 
-1.00000 1.00000 -1.00000 1.00000 

मुझे पता है के रूप में ओपनजीएल में मानों के लिए यह सही क्रम नहीं है, क्योंकि स्थिति मैक्टर द्वारा इस मैट्रिक्स को गुणा करने से सभी अनुवाद मानों को अनदेखा कर दिया जाएगा।

मैंने अपने शेडर और कुछ प्राइमेटिव के साथ मैट्रिक्स का परीक्षण किया और मुझे केवल एक खाली स्क्रीन मिल गई। इसके अलावा

0.00313 0.00000 0.00000 -1.00000 
0.00000 -0.00417 0.00000 1.00000 
0.00000 0.00000 -0.00200 -1.00000 
0.00000 0.00000 0.00000 1.00000 

, समारोह "ऑर्थो" को देखकर "GLM/gtc/matrix_transform.inl" फ़ाइल में: लेकिन अगर मैं हाथ से मैट्रिक्स को संशोधित यह ठीक काम करता है इस प्रकार है

template <typename valType> 
inline detail::tmat4x4<valType> ortho(
    valType const & left, 
    valType const & right, 
    valType const & bottom, 
    valType const & top, 
    valType const & zNear, 
    valType const & zFar) 
{ 
    detail::tmat4x4<valType> Result(1); 
    Result[0][0] = valType(2)/(right - left); 
    Result[1][1] = valType(2)/(top - bottom); 
    Result[2][2] = - valType(2)/(zFar - zNear); 
    Result[3][0] = - (right + left)/(right - left); 
    Result[3][1] = - (top + bottom)/(top - bottom); 
    Result[3][2] = - (zFar + zNear)/(zFar - zNear); 
    return Result; 
} 

मैं निम्नलिखित कोड द्वारा पिछले 3 आरंभीकरण लाइनों जगह ले ली है और यह भी ठीक काम किया:

Result[0][3] = - (right + left)/(right - left); 
    Result[1][3] = - (top + bottom)/(top - bottom); 
    Result[2][3] = - (zFar + zNear)/(zFar - zNear); 

यह एक कम से कम शीर्ष शेडर कि मैं परीक्षण के लिए उपयोग कर रहा हूँ (ध्यान दें कि है इस पल में uni_MVP केवल projecti है मैट्रिक्स पर ऊपर वर्णित):

uniform mat4 uni_MVP; 

in vec2 in_Position; 

void main(void) 
{ 
    gl_Position = uni_MVP * vec4(in_Position.xy,0.0, 1.0); 
} 

मुझे लगता है कि यह एक बग नहीं है, क्योंकि सभी कार्य एक ही तरीके से काम करते हैं। शायद मेरे सी ++ कंपाइलर का मुद्दा है जो बहुआयामी सरणी के क्रम को बदल देता है? सभी जीएलएम स्रोत कोड को संशोधित किए बिना मैं इसे कैसे हल कर सकता हूं?

मैं जीएलएम लाइब्रेरी (0.9.1) के अंतिम संस्करण का उपयोग कर रहा हूं जिसमें कोड :: ब्लॉक और मिनीजीडब्ल्यू विंडोज विस्टा पर चल रहा है।

उत्तर

22

सबसे पहले, इसे पारदर्शिता कहा जाता है, उलटा नहीं। उलटा मतलब कुछ अलग है। दूसरा, यह बिल्कुल ठीक है कि यह कैसे होना चाहिए। ओपन स्तंभ प्रमुख क्रम में मैट्रिक तक पहुँचता है, यानी मैट्रिक्स तत्वों निम्नलिखित सूचकांक करने के लिए है:

0 4 8 12 
1 5 9 13 
2 6 10 14 
3 7 11 15 

हालांकि अपने सामान्य C/C++ बहुआयामी सरणियों आप इस तरह सामान्य रूप से नंबर:

0 1 2 3 
4 5 6 7 
8 9 10 11 
12 13 14 15 

यानी पंक्ति और स्तंभ सूचकांक transposed हैं। ओपनजीएल के पुराने संस्करणों ने कुछ विस्तार किया जो लोगों को उनके कोड को फिर से लिखने के लिए ट्रांसपोज़ड फॉर्म में मैट्रिस की आपूर्ति करने की अनुमति देता है। इसे कहा जाता है GL_ARB_transpose_matrixhttp://www.opengl.org/registry/specs/ARB/transpose_matrix.txt

शेडर्स के साथ नए कार्यों का उपयोग करने से भी आसान है। glUniformMatrix में पैरामीटर GLboolean transpose है, आपको 3 अनुमान हैं कि यह क्या करता है।

+0

धन्यवाद, डेटनवॉल्फ! GlUniformMatrix पर ट्रांसपोज़ पैरामीटर बदलकर फिक्स्ड :) – Dani

संबंधित मुद्दे