2011-01-06 15 views
6

संपादित करें: रोटोग्लुप को मेरे कोड में समस्याएं मिलीं, जिससे मैंने हटाए गए शेडर्स को हल किया। सही कोड (शेडर्स के साथ) के लिए नीचे मेरा उत्तर देखें।मूल ओपनजीएल, वर्टेक्स बफर और पायगलेट

हाय सब!

मैं this tutorial से आधुनिक ओपनजीएल की कुछ मूल बातें सीखने की कोशिश कर रहा हूं।

हालांकि मैं इसे C++ के बजाय पायथन/पायगलेट के साथ करना चाहता हूं। मुझे पता है कि पिगलेट कम स्तर के ओपनजीएल दूर अमूर्त कर सकते हैं; हालांकि मैं अमूर्तता की परतों के पीछे छिपाने के लिए आगे बढ़ने से पहले कुछ मूल बातें समझना चाहता हूं।

मेरी समस्या बेहद सरल है: नीचे दिया गया कोड केवल 3 की बजाय एक बिंदु खींचता है। मेरा कोड है, जहां तक ​​मैं कह सकता हूं, ट्यूटोरियल में सी ++ के समान, वर्टेक्स और खंड शेडर्स को हटाने के अलावा (के माध्यम से पाइथन में किया गया), जो मेरी समस्या में कोई फर्क नहीं पड़ता है।

चीजों को एक ही बिंदु पर सरलीकृत करना व्यवहार को दिखाता है जो मुझे समझ में नहीं आता है (पहला समन्वय केवल एक ही प्रभावशाली प्रतीत होता है जो मुझे प्रभावित करता है), जिससे मुझे मेरी धारणा का सामना करना पड़ता है कि मैं बस कुछ भी मूलभूत समझने में असफल रहा हूं pyglet, ओपन, या यहाँ तक कि 3 डी सामान्य रूप में: p

यहाँ प्रासंगिक कोड है:

import pyglet 
from pyglet.gl import * 

window = pyglet.window.Window() 

positionBufferObject = GLuint() 
vao = GLuint() 

vertexPositions = [0.0, 0.0, 0.0, 
        0.25, 0.0, 0.0, 
        1.75, 1.75, 0.0] 

vertexPositionsGl = (GLfloat * len(vertexPositions))(*vertexPositions) 

@window.event 
def on_draw(): 
    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject) 
    glEnableVertexAttribArray(0) 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0) 
    glDrawArrays(GL_POINTS, 0, 3) 
    glDisableVertexAttribArray(0) 

glGenBuffers(1, positionBufferObject) 
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject) 
glBufferData(GL_ARRAY_BUFFER, len(vertexPositionsGl)*4, vertexPositionsGl, GL_STATIC_DRAW) 
glBindBuffer(GL_ARRAY_BUFFER, 0) 

glClearColor(0.0, 0.0, 0.0, 0.0) 
pyglet.app.run() 
+0

आपका मतलब है कि सही कोड के साथ, आपके पास अभी भी एक बिंदु खींचा गया है? क्या यह बिंदु स्क्रीन के बीच में खींचा गया है? यदि आप पहले निर्देशांक बदलते हैं, तो क्या बिंदु बढ़ता है? – rotoglup

+0

सही कोड के साथ, मुझे जो भी मिलता है वह अभी भी एक बिंदु है जो डब्ल्यू समन्वय के साथ 1 पर और बाइट्स में आकार को पार करके नहीं चलता है। यदि मैं डब्ल्यू समन्वय को हटा देता हूं और तदनुसार glVertexAttribPointer बदलता हूं, तो मुझे कुछ भी नहीं मिलता है। मैं पूरी तरह उलझन में हूँ! –

+0

सुधार: कुछ दिखाने के लिए डब्ल्यू 0 पर होना चाहिए, जो केवल मुझे और अधिक उलझन में डाल देता है। –

उत्तर

5
glDrawArrays(GL_POINTS, 0, 1) 

अपने ट्यूटोरियल में, 1 अंक आकर्षित करने के लिए निर्देश देता है, 1 से 3 है:

glDrawArrays(GL_POINTS, 0, 3) 

सूचना भी है कि अपने कोने के 4 (डब्ल्यू) घटक 1, नहीं 0 होना चाहिए:

vertexPositions = [0.0, 0.0, 0.0, 1.0, 
        0.25, 0.0, 0.0, 1.0, 
        1.75, 1.75, 0.0, 1.0] 

वैकल्पिक रूप से, आप w घटक को दूर कर सकता है,

vertexPositions = [0.0, 0.0, 0.0, 
        0.25, 0.0, 0.0, 
        1.75, 1.75, 0.0] 

और परिवर्तन निम्नलिखित कॉल करने के लिए:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0) 

एक और बात, मैं पिगलेट में एक विशेषज्ञ नहीं हूं, लेकिन यह संभव है कि glbufferData, अपने सी समकक्ष की तरह, तत्वों में नहीं, बाइट्स में एक आकार ले लो। प्रत्येक नाव 4 बाइट किया जा रहा है, तो आप की कोशिश कर सकते:

glBufferData(GL_ARRAY_BUFFER, len(vertexPositionsGl)*4, vertexPositionsGl, GL_STATIC_DRAW) 
+0

उत्तर के लिए धन्यवाद! मैंने अपने प्रश्नों को आपके सुझावों के साथ संपादित किया है (मैंने वास्तव में ड्राएरे कॉल के सही संस्करण की कोशिश की थी लेकिन मेरे कोड को कॉपी करने से पहले इसे पुनर्स्थापित करना भूल गया था)। मुद्दा अभी भी मौजूद है हालांकि ... मुझे आश्चर्य है कि पिगलेट के मेरे संस्करण में कुछ गड़बड़ है, मुझे ग्लूटोल्स का उपयोग करने के लिए विकास संस्करण स्थापित करना पड़ा। –

+0

एक और संभावित सुधार जोड़ने के लिए उत्तर संपादित किया गया। – rotoglup

+0

(आगे) उत्तर के लिए धन्यवाद! दुर्भाग्य से अभी भी कोई खुशी नहीं है ... मुझे आश्चर्य है कि यह ओपनजीएल मुद्दे होने की बजाय पिगलेट के लिए विशिष्ट है या नहीं। मैं पिगलेट मेलिंग सूची आज़माउंगा और रिपोर्ट करूंगा! –

4

मैं अंत में यह अधिकार मिल गया है!

ऐसा लगता है कि मुझे इस तथ्य से गुमराह किया जा रहा था कि चरम, glDrawArrays और glVertexAttribPointer के साथ झुकाव कभी-कभी एक ही बिंदु दिखाया जा रहा है। यह एक दुर्घटना प्रतीत होता है: rotoglup के उत्तर द्वारा प्रदान किए गए सुधारों के साथ, कुछ भी नहीं खींचा जाता है। यह मेरे मूल प्रश्न में कोड के लिए "सही" व्यवहार है।

मामले में अपनी गलतियों की एक सूची यह किसी को भी मदद करता है:

  • w की स्थापना 1 0 करने के लिए समन्वय, बजाय, पूरी तरह से ट्यूटोरियल में क्लिप अंतरिक्ष परिवर्तन के लिए स्पष्टीकरण गायब है।

  • ग्लैफफरडेटा को बाइट्स की अपेक्षा करते समय बफर के आकार को बफर का आकार देता है।

  • कशेरुक और टुकड़े के शेडरों को हटाने (उपर्युक्त दो मुद्दों की तलाश करते समय कोड को सरल बनाने के लिए)। इसने सुनिश्चित किया कि कुछ भी कभी भी प्रस्तुत नहीं किया जाएगा ... (बग्गी?) एकल बिंदु को छोड़कर मुझे कभी-कभी मिल रहा था।

रिकॉर्ड के लिए, नीचे दिए गए कोड को एक एकल त्रिकोण को प्रदर्शित करता है, shaders के माध्यम से पास के साथ, क्या मैं तारीख और सही ओपन अप करने के लिए होने की आशा में। आवश्यकताएं पिगलेट और ग्लेटोल्स हैं।

import pyglet 
from pyglet.gl import * 
from gletools import ShaderProgram, FragmentShader, VertexShader 

window = pyglet.window.Window() 

positionBufferObject = GLuint() 

vertexPositions = [0.75, 0.75, 0.0, 1.0, 
        0.75, -0.75, 0.0, 1.0, 
        -0.75, -0.75, 0.0, 1.0] 
vertexPositionsGl = (GLfloat * len(vertexPositions))(*vertexPositions) 

program = ShaderProgram(
    FragmentShader(''' 
    #version 330 
    out vec4 outputColor; 
    void main() 
    { 
     outputColor = vec4(1.0f, 1.0f, 1.0f, 1.0f); 
    }'''), 
    VertexShader(''' 
    #version 330 
    layout(location = 0) in vec4 position; 
    void main() 
    { 
     gl_Position = position; 
    }''') 
) 

@window.event 
def on_draw(): 
    with program: 
     glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject) 
     glEnableVertexAttribArray(0) 
     glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0) 
     glDrawArrays(GL_TRIANGLES, 0, 3) 
     glDisableVertexAttribArray(0) 

glGenBuffers(1, positionBufferObject) 
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject) 
glBufferData(GL_ARRAY_BUFFER, len(vertexPositionsGl)*4, vertexPositionsGl, GL_STATIC_DRAW) 
glBindBuffer(GL_ARRAY_BUFFER, 0) 

pyglet.app.run() 
संबंधित मुद्दे