2013-01-24 34 views
5

में घन बनाने के लिए सबसे अच्छा तरीका एक घन बनाने के लिए सबसे अच्छा तरीका (सबसे कम स्मृति, सबसे तेज़ गति) कौन सा है?ओपनजीएल

डेटा struct:

GLfloat Cube::vertices[] = 
{-0.5f, 0.0f, 0.5f, 0.5f, 0.0f, 0.5f, 0.5f, 1.0f, 0.5f, -0.5f, 1.0f, 0.5f, 
    -0.5f, 1.0f, -0.5f, 0.5f, 1.0f, -0.5f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, -0.5f, 
    0.5f, 0.0f, 0.5f, 0.5f, 0.0f, -0.5f, 0.5f, 1.0f, -0.5f, 0.5f, 1.0f, 0.5f, 
    -0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 1.0f, 0.5f, -0.5f, 1.0f, -0.5f 
    }; 

GLfloat Cube::texcoords[] = { 0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0, 
           0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0, 
           0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0, 
           0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0 
          }; 

GLubyte Cube::cubeIndices[24] = {0,1,2,3, 4,5,6,7, 3,2,5,4, 7,6,1,0, 
            8,9,10,11, 12,13,14,15}; 

ड्रॉ समारोह:

 glEnable(GL_TEXTURE_2D); 
     glBindTexture(GL_TEXTURE_2D, texture); 
     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
     glColor3f(1.0f, 1.0f, 1.0f); 

     glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
     glEnableClientState(GL_VERTEX_ARRAY); 

     glTexCoordPointer(2, GL_FLOAT, 0, texcoords); 
     glVertexPointer(3, GL_FLOAT, 0, vertices); 

     glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, cubeIndices); 
     glDisableClientState(GL_VERTEX_ARRAY); 
     //glDisableClientState(GL_COLOR_ARRAY); 
     glDisable(GL_TEXTURE_2D); 

आप परिणाम देख सकते हैं सही है: cube

लेकिन करने के लिए कुछ समय के बाद मैं इस समाधान खोजने के लिए है इस परिणाम को दोबारा शुरू करें मुझे कुछ कशेरुकाओं को फिर से परिभाषित करना है (vertices सरणी में 16 3 डी अंक हैं) अन्यथा बनावट वें मानचित्र में विफल हो जाती है ई DrawElement समारोह।

किसी को कशेरुक सरणी में घन बनाने के लिए एक बेहतर तरीका पता है?

+3

आपको "सबसे तेज़/सबसे कम स्मृति" की आवश्यकता क्यों है, क्या आप स्क्रीन पर अरबों cubes रखने की योजना बना रहे हैं? इसके अलावा, "कुछ कशेरुक को फिर से परिभाषित करने" के साथ आपका क्या मतलब है? –

+0

क्यूब बनावट सेट करने के बाद, एफपीएस कम हो गया है (60 से 40 तक)। मैंने "वर्टिसेस" सरणी में कुछ वर्टेक्स को फिर से परिभाषित किया है, यदि आप बारीकी से देखते हैं तो उस सरणी में 16 अंक (3 डी) हैं, लेकिन एक घन 8 को परिभाषित करने के लिए पर्याप्त हैं। – Luca

+2

आप कुछ गलत कर रहे हैं और शायद यह घन नहीं है, 8 या 16 शिखर कोई फर्क नहीं पड़ता है। यह भी मान लें कि प्रत्येक कशेरुक 3 चेहरों को जोड़ता है और उनमें सभी के पास एक अलग यूवी समन्वय होता है, आपको उन "अतिरिक्त" कोष्ठकों की आवश्यकता होती है। मुझे यकीन नहीं है, लेकिन जब आप बनावट बनाते हैं, तो आपको केवल glTexParameteri को कॉल करना होगा, अगर यह आपके लूप पर है तो यह मंदी के कारण हो सकता है। –

उत्तर

1

मैं ओपनग्ल es के साथ काम करते हुए एक ही मुद्दे में भाग गया। मेरे शोध से संकेत मिलता है कि ऐसा करने का कोई और तरीका नहीं था क्योंकि प्रत्येक चरम पर केवल एक बनावट समन्वय हो सकता था।

0

ठीक है, आप क्यूब मैप बनावट का उपयोग कर सकते हैं जिसमें आपका वर्टेक्स शेडर बनावट निर्देशांक का ख्याल रखेगा। कोने फिर से परिभाषित करने

out vec2 texcoords; 
texcoords=normalize(vertex_data.xy) 

कोई ज़रूरत नहीं है, यह भी आप शीर्ष बफर वस्तुओं का उपयोग करके प्रदर्शन में सुधार कर सकते हैं: तुम सब tex coords उत्पन्न करने के लिए क्या करना है अपने शिखर शेडर में इस लाइन को जोड़ने के लिए है।

+0

यह मेरे लिए शुरुआती है कि एक शेडर – Luca

+0

का उपयोग मैं आपको "शुरुआती मेरे लिए" से क्या मतलब नहीं लेता .. ..? – debonair

+0

मैं ओपनजीएल दुनिया में नया हूं, मैं बस आधार – Luca