2009-12-27 14 views
6

मैं ओपनजीएल के लिए बिल्कुल नया हूं, और मुझे कुछ कठिनाइयों का सामना करना पड़ रहा है। मैंने जीएलएसएल में एक साधारण शेडर लिखा है, जो कि सरल कंकाल एनीमेशन की इजाजत देकर संयुक्त मैट्रिस द्वारा शिखर को बदलना है। प्रत्येक कशेरुक में अधिकतम दो हड्डियों का प्रभाव होता है (एक वीईसी 2 के एक्स और वाई घटकों के रूप में संग्रहीत), सूचकांक और संबंधित वजन जो रूपांतरण मैट्रिस की सरणी से जुड़े होते हैं, और मेरे शेडर में "विशेषता चर" के रूप में निर्दिष्ट होते हैं, फिर सेट करते हैं "glVertexAttribPointer" फ़ंक्शन का उपयोग कर।कोको और ओपनजीएल, मैं एक सरणी का उपयोग कर जीएलएसएल वर्टेक्स विशेषता कैसे सेट करूं?

यहां समस्या उत्पन्न होती है ... मैंने मैट्रिक्स के "वर्दी वेरिएबल" सरणी को सही ढंग से सेट करने में कामयाब रहा है, जब मैं शेडर में उन मानों की जांच करता हूं, तो वे सभी सही तरीके से आयात किए जाते हैं और उनमें सही डेटा होता है। हालांकि, जब मैं संयुक्त सूचकांक चर सेट करने का प्रयास करता हूं तो अक्षरों को मनमानी परिवर्तन matrices द्वारा गुणा किया जाता है! वे अंतरिक्ष में यादृच्छिक स्थिति में कूदते हैं (जो हर बार अलग होते हैं) मैं मानता हूं कि सूचकांक गलत तरीके से सेट किए गए हैं और मेरा शेडर मेरी संयुक्त मैट्रिक्स सरणी के अंत में निम्नलिखित स्मृति में पढ़ रहा है। मुझे बिल्कुल यकीन नहीं है कि क्यों, इस विषय पर मुझे मिली सारी जानकारी पढ़ने पर, मैं उनके उदाहरणों में समान (यदि बहुत समान नहीं) कोड देखकर आश्चर्यचकित हुआ, और ऐसा लगता है कि उनके लिए काम करना प्रतीत होता है।

मैंने कुछ समय से इस समस्या को हल करने का प्रयास किया है और यह वास्तव में मेरे तंत्रिकाओं पर पहुंचने लगा है ... मुझे पता है कि matrices सही हैं, और जब मैं मैन्युअल रूप से शेडर में सूचकांक मान को मनमाने ढंग से बदलता हूं पूर्णांक, यह सही मैट्रिक्स मानों को पढ़ता है और जिस तरह से काम करता है, उस मैट्रिक्स द्वारा सभी कोष्ठकों को बदलता है, लेकिन जब मैं विशेषता चर सेट करने के लिए लिखे गए कोड को आजमाता हूं और उपयोग करता हूं, तो ऐसा लगता है कि यह काम नहीं कर रहा है।

कोड मैं इस प्रकार चर है स्थापित करने के लिए उपयोग कर रहा हूँ ...

// this works properly... 
GLuint boneMatLoc = glGetUniformLocation([[[obj material] shader] programID], "boneMatrices"); 
glUniformMatrix4fv(boneMatLoc, matCount, GL_TRUE, currentBoneMatrices); 

GLfloat testBoneIndices[8] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; 

// this however, does not... 
GLuint boneIndexLoc = glGetAttribLocation([[[obj material] shader] programID], "boneIndices"); 
glEnableVertexAttribArray(boneIndexLoc); 
glVertexAttribPointer(boneIndexLoc, 2, GL_FLOAT, GL_FALSE, 0, testBoneIndices); 

और मेरे शिखर शेडर इस तरह दिखता है ...

// this shader is supposed to transform the bones by a skeleton, a maximum of two 
// bones per vertex with varying weights... 

uniform mat4 boneMatrices[32]; // matrices for the bones 
attribute vec2 boneIndices; // x for the first bone, y for the second 

//attribute vec2 boneWeight; // the blend weights between the two bones 

void main(void) 
{ 
gl_TexCoord[0] = gl_MultiTexCoord0; // just set up the texture coordinates... 


vec4 vertexPos1 = 1.0 * boneMatrices[ int(boneIndex.x) ] * gl_Vertex; 
//vec4 vertexPos2 = 0.5 * boneMatrices[ int(boneIndex.y) ] * gl_Vertex; 

gl_Position = gl_ModelViewProjectionMatrix * (vertexPos1); 
} 

यह वास्तव में मुझे हताश करने के लिए शुरुआत है , और किसी भी और सभी मदद की सराहना की जाएगी,

एंड्रयू Gotow

उत्तर

2

ठीक है, मैं figu है इसे लाल करो। ओपनजीएल ड्रॉअरेज़ फ़ंक्शन के साथ त्रिभुजों को प्रत्येक 9 मानों को त्रिभुज के रूप में पढ़कर (प्रत्येक 3 घटक के साथ 3 शिखर) पढ़ता है। इस वजह से, त्रिकोणों के बीच कोने को दोहराया जाता है, इसलिए यदि दो आसन्न त्रिकोण एक चरम साझा करते हैं तो यह सरणी में दो बार आता है। तो मेरा घन जिसे मैंने मूल रूप से सोचा था 8 अक्षरों में, वास्तव में 36 है!

छः पक्ष, दो त्रिकोण एक तरफ, तीन त्रिकोण प्रति त्रिभुज, सभी 8 साझा किए गए लोगों के बजाय कुल 36 स्वतंत्र शीर्षकों में गुणा करते हैं।

पूरी समस्या बहुत कम मान निर्दिष्ट करने के साथ एक मुद्दा था। जैसे ही मैंने 36 टेस्ट को शामिल करने के लिए अपनी टेस्ट सरणी बढ़ा दी, यह पूरी तरह से काम करता था।

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