c++ - glDrawArray() एक स्मृति अपवाद देता है



memory opengl (1)

सभी ऑब्जेक्ट्स के माध्यम से लूपिंग करते समय मैं अपने 3 डी-इंजन में प्रस्तुत करना चाहता हूं, कॉल करने का प्रयास करते समय मुझे एक त्रुटि मिलती है

glDrawArrays(mesh->primitiveType, 0, mesh->vertexCount); 

चूंकि यह 0x0000000 स्थान से पढ़ने की कोशिश करता है, इसलिए जाहिर है कि सूचक जाल-> vertexBuffer अनुक्रमणिका शून्य से जुड़ा हुआ है। यह सब मेरे रेंडरबल ऑब्जेक्ट क्लास के भीतर होता है। इस वर्ग के उदाहरणों के लिए एक जाल है, और इस जाल में एक सूचकांक है जो VertexArray से लिंक होना चाहिए। लेकिन जाहिर है

glBindBuffer(GL_ARRAY_BUFFER, mesh->vertexBuffer);

असफल रहा है

अजीब बात यह है कि यह मेरे मैक, और कई अन्य विंडोज कंप्यूटर पर चलेगा - लेकिन यह इस (विंडोज़) कंप्यूटर पर नहीं चलेगा। क्योंकि मैं परीक्षण कर रहा हूं मैंने सभी 3 डी मॉडल हटा दिए, और पाया कि यह प्राथमिकताएं हैं जो समस्या पैदा कर रही हैं, किसी भी तरह एमएसवीसी ++ कंपाइलर ने मेरे कोड को "अनुकूलित" किया है, सबकुछ हटाने के बाद

glGenBuffers(1, &CubeMesh.vertexBuffer);

और शायद यही कारण है कि कुछ भी बंधी नहीं है, या तो मैंने सोचा। मैंने लिंकर / कंपाइलर ऑप्टिमाइज़ेशन को अक्षम कर दिया, और मैं देख सकता था कि ऑलब्रेपॉइंट्स अब हिट हो जाएंगे - लेकिन मुझे अभी भी एक ही अपवाद मिलता है, और मैं पूरी तरह से अनजान हूं कि यह क्यों काम नहीं करता है।

प्रोजेक्ट का पूरा स्रोत @ https://github.com/Wrap/TwinGame/tree/master/src पाया जा सकता है, जहां तक ​​मैं समस्या बता सकता हूं Primitives.cpp में है, और / या RenderableObject.cpp (विशेष रूप से रेंडरबल ऑब्जेक्ट :: ड्रा (); विधि) फ़ाइल। क्या मैं संरक्षित कुछ पढ़ने की कोशिश कर रहा हूं, LoadPrimitives () के साथ क्या गलत है; तरीका?

इसे पढ़ने का समय निकालने के लिए धन्यवाद।


RenderableObject::RenderableObject(ObjectManager* objectmgr) : Object(objectmgr), visible(true), scale(1.0f), mesh(0) {
    mObjMgr->registerRenderable(this);
}

मुझे लगता है कि आपकी समस्या mesh(0) । हो सकता है कि आप इस मान को आरंभ करने से पहले Draw() विधि को कॉल कर रहे हों। शायद आपका Renderer क्लास करता है।

किसी फ़ंक्शन कॉल से पहले assert(mesh != 0) जोड़ने assert(mesh != 0) प्रयास करें।

void RenderableObject::Draw(class ShaderManager* shaderMgr){
    //TODO: iterate through all meshes that belong to the object

    assert(mesh != 0)

    glBindBuffer(GL_ARRAY_BUFFER, mesh->vertexBuffer[0]);

और मुझे आशा है कि, यदि आप GL_ARB_vertex_buffer_object उपलब्ध हैं, तो आप जांच रहे हैं। मेरी आशा है कि इससे काम हो जाए।





3d-engine