2010-07-06 20 views
5

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

void loadCVTexture(GLuint& texture, const cv::Mat_<Vec3f>& image){ 
    if(texture != 0){ 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, image.cols, image.rows, GL_BGR, GL_FLOAT, image.data); 
    } else { 
    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexImage2D(GL_TEXTURE_2D, 0, 3, image.cols, image.rows, 0, GL_BGR, GL_FLOAT, image.data); 
    } 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
} 

मैंने पहलेglutMainLoop() पहली छवि प्रारंभ और इसे सही ढंग से प्रदर्शित करता है। इसे आईडी 1 दिया गया है। जब मैं छवि को फिर से अपडेट करता हूं तो तस्वीर बदलती नहीं है। (मैंने पुष्टि की है कि प्रदर्शन समारोह कहा जा रहा है, और यह छवि अलग है।)

संपादित करें: एक और सुराग, मेरे पास उप-खिड़कियां हैं। अगर मैं अपनी दूसरी विंडो पर टिप्पणी करता हूं तो कोड अपेक्षित काम करता है।

+0

वैसे, 'glGetError() '' 0' लौटा रहा है। – Geoff

+1

मुझे परेशान है, यह लगता है * बस * दाएं ... – Staffan

+0

जब आप छवि को पुन: चित्रित करने का प्रयास करते हैं तो z-buffer और रंग बफर स्पष्ट होते हैं? क्या स्टैंसिल ऑपरेशन हैं? glScissor? या शायद glViewport अजीब मूल्य पर सेट किया गया था? क्या होता है जब आप SubImage2D के बजाय प्रत्येक फ्रेम glteexImage2d का उपयोग करते हैं? मुझे लगता है कि यह सब-विंडो कोड से संबंधित है - शायद glViewport या glScissors या कुछ समान है। – SigTerm

उत्तर

2

चूंकि यह "उप-विंडोज़" के बिना सही तरीके से काम करता है, तो मेरा अनुमान होगा कि आपके एप्लिकेशन में एकाधिक ओपनजीएल संदर्भ हैं, और बनावट का अद्यतन गलत संदर्भ के साथ होता है।

अपने प्रदर्शन फ़ंक्शन में बनावट को अपलोड करने का प्रयास करें और देखें कि इससे कोई फर्क पड़ता है या नहीं।

+0

सही! धन्यवाद! अब मैंने उपरोक्त फ़ंक्शन पर कॉल करने से पहले 'glutSetWindow (leftPanel) रखा है; – Geoff

1

क्या आप मौजूदा लोगों की बजाय अनुक्रम में नई छवियां दिखाने की कोशिश कर रहे हैं?
इस मामले में आपको केवल image.data को बदलने की आवश्यकता है, न कि एक नया बनावट बाध्यकारी बनाएं।

+0

हां (मैंने प्रश्न को थोड़ा और स्पष्ट करने के लिए अद्यतन किया)। मैंने सोचा कि जब आप इन कार्यों में से किसी एक को कॉल करते हैं तो सरणी की प्रतिलिपि बनाई जाती है। क्या यह मामला नहीं है? यदि ऐसा है, तो मेरा छवि डेटा निश्चित रूप से दायरे से बाहर हो जाएगा। – Geoff

+0

मान लीजिए कि वे एक ही आकार/प्रारूप/आदि हैं, बस नए पिक्सेल डेटा को image.data पर कॉपी करें http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml –