के माध्यम से संपूर्ण वीडियो मेमोरी एक्सेस करें ओपनजीएल प्रोग्रामिंग के माध्यम से विशेष रूप से, वीडियो मेमोरी की सभी सामग्री प्राप्त करने के लिए, ग्राफिक्स कार्ड की वीडियो मेमोरी तक कैसे पहुंचे?ओपनजीएल प्रोग्रामिंग
मैंने निम्नलिखित दो विधियों का प्रयास किया है, लेकिन असफल रहा है। उन्हें नीचे जोड़ने के साथ, मुझे उम्मीद है कि आप मेरे कार्यक्रम में या वीडियो मेमोरी की संरचना की मेरी समझ में त्रुटि को इंगित कर सकते हैं। अग्रिम में धन्यवाद!
मेरा मूल विचार वीडियो मेमोरी की सभी सामग्री की खोज तक वीडियो स्मृति में एक अनियमित क्षेत्र आवंटित करना जारी रखना है।
(1) मुख्य समारोह में, मैं डबल बफर वाले एक विंडो बनाता हूं (निम्नलिखित कोड देखें)।
int main(int argc,char ** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); // double buffers
glutInitWindowPosition(0,0);
glutInitWindowSize(windowWidth, windowHeight);
glutCreateWindow("Hope to be successful!");
glutDisplayFunc(myDisplay); // call back function "myDisplay"
glutKeyboardFunc(keyboard);
glutMainLoop();
free(PixelData);
return 0;
}
फिर, "myDisplay" समारोह में सबसे पहले मैं glReadPixels() फ़ंक्शन को कॉल करें, वापस फ्रेमबफर से बाहर पिक्सल के एक दिया आकार आयत को पढ़ने के लिए एक सरणी "PixelData" में इन पिक्सल जानकारी बचाने के लिए, और अंत में gldrawPixels() फ़ंक्शन को कॉल करके स्क्रीन पर उन पिक्सेल जानकारी को प्रदर्शित करें। इस कार्यक्रम को निष्पादित करने के बाद, केवल एक काला खिड़की दिखाई देती है। काला डिफ़ॉल्ट रंग है। तो इसका मतलब है कि खिड़की में कुछ भी नहीं है। फिर मैंने बैक फ्रेमबफर के बाहर अन्य क्षेत्रों को पढ़ने की कोशिश की है, और उनमें से सभी में कुछ भी नहीं है।
उपर्युक्त से निष्कर्ष यह है कि बैक फ्रेमबफर में कुछ भी शामिल नहीं है। हालांकि, यह अनुचित है क्योंकि फ्रंट बफर में केवल वर्तमान स्क्रीन सामग्री/खिड़की होनी चाहिए, और इस प्रकार स्क्रीन के निचले हिस्से में खोले गए और कम से कम अन्य खिड़कियां बैक फ्रेमबफर में अपनी सामग्री होनी चाहिए, लेकिन बैक फ्रेमबफर खाली है। तो उन खिड़कियां कहाँ हैं (नीचे से मेरे द्वारा खोला और छोटा) संग्रहित?
मुझे लगता है कि मेरे प्रोग्राम के लिए आवंटित फ्रेमबफर (पीछे और आगे) केवल पूरी वीडियो मेमोरी का एक छोटा हिस्सा है। इस प्रकार उन कम से कम विंडोज़ सामग्री को वीडियो मेमोरी के अन्य स्थानों में संग्रहीत किया जाना चाहिए।
कुछ समय बाद, मैंने ओपनजीएल फ्रेमबफर ऑब्जेक्ट (एफबीओ) के लिए एक परिचय पढ़ा, और एक वाक्य है: डिफ़ॉल्ट रूप से, ओपनजीएल फ्रेमबफर को एक प्रतिपादन गंतव्य के रूप में उपयोग करता है जो पूरी तरह से विंडो सिस्टम द्वारा बनाया और प्रबंधित किया जाता है। इस डिफ़ॉल्ट फ्रेमबफर को विंडो-सिस्टम-प्रदत्त फ्रेमबफर कहा जाता है। यह प्रतीत होता है कि मेरे उपरोक्त अनुमान को सत्यापित करता है।
(2) फिर मैं उम्मीद के साथ एफबीओ पर काम करना शुरू कर देता हूं कि एफबीओ मुझे पूरी वीडियो मेमोरी सामग्री का पता लगाने में मदद कर सकता है।
नीचे दिए गए मुख्य समारोह में, मैं एक एफबीओ और 7 रेंडरबफर ऑब्जेक्ट्स (आरबीओ) बनाता हूं, और फिर इन 7 आरबीओ को इस संलग्नक बिंदुओं के माध्यम से इस एफबीओ में संलग्न करता हूं।
const int RBO_COUNT = 7; //how many renderBuffer objects are created to attach to the frameBuffer object
int main(int argc, char **argv)
{
....
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_ALPHA); // display mode
...
// create a framebuffer object
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
//Create several 7 render buffer objects and attach all of them to the FBO.
glGenRenderbuffers(RBO_COUNT, rbo);
for (int i = 0; i < RBO_COUNT; i++)
{
glBindRenderbuffer(GL_RENDERBUFFER, rbo[i]);
glRenderbufferStorage(GL_RENDERBUFFER, PIXEL_FORMAT, SCREEN_WIDTH, SCREEN_HEIGHT);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, colorAttach[i], GL_RENDERBUFFER, rbo[i]);
}
// check FBO status
bool status = checkFramebufferStatus();
if(!status) fboUsed = false;
glBindFramebuffer(GL_FRAMEBUFFER, 0);
...
glutMainLoop(); /* Start GLUT event-processing loop */
return 0;
}
नीचे मेरे प्रदर्शन कॉलबैक फ़ंक्शन का मुख्य हिस्सा है। इसका फ़ंक्शन स्पेस कुंजी का उपयोग करने के लिए है जो कि रेंडरबफर ऑब्जेक्ट को पढ़ने के लिए नियंत्रित करता है, और उसके बाद स्क्रीन पर अपनी सामग्री प्रदर्शित करता है।
void displayCB()
{
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
//read this FBO attached RBO, save its content to fboContent
//"count" is a global variable, and is incremented by 1 (mod)every time pressing the space key of the keyboard.
glReadBuffer(colorAttach[count]);
glReadPixels(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, PIXEL_FORMAT, GL_UNSIGNED_BYTE, fboContent);
// back to normal window-system-provided framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, 0); // unbind
// render to the default framebuffer //////////////////////////
glClear(GL_COLOR_BUFFER_BIT); // clear buffer
glClearColor(1, 0, 0, 1);
glDrawBuffer(GL_BACK);
glRasterPos2i(-1, -1);
glDrawPixels(SCREEN_WIDTH, SCREEN_HEIGHT, PIXEL_FORMAT, GL_UNSIGNED_BYTE, fboContent);
glutSwapBuffers();
}
अंतिम परिणाम निराशाजनक है। सभी रेंडरबफर ऑब्जेक्ट्स की सामग्री खाली है। मुझे इसका कारण पता नहीं है, क्योंकि मैंने सोचा था कि इन सभी आरबीओ को कभी शुरू नहीं किया गया था और इसमें कुछ शेष सामग्री होनी चाहिए।
"मैंने सोचा था कि इन सभी आरबीओ को कभी शुरू नहीं किया गया था और इसमें कुछ शेष सामग्री होनी चाहिए।" फिर आपको कल्पना को फिर से पढ़ना चाहिए। यह कहता है कि उनकी सामग्री * अनिर्धारित * हैं। अपरिभाषित "शेष सामग्री" का मतलब हो सकता है। इसका मतलब "शून्य स्मृति" भी हो सकता है। इसका मतलब यह हो सकता है कि "स्मृति कुछ मनमानी रंगों को सेट करती है ताकि बग को पकड़ना आसान हो।" अपरिभाषित साधन * अपरिभाषित *। –
spec (http://www.opengl.org/wiki/Renderbuffer_Object) कहता है कि "रेंडरबफर को अनियमित बनाया गया है।" मेरे विचार से आप सही है। चाहे अनियंत्रित आरबीओ खाली हों या कुछ शेष सामग्री को तब निर्धारित किया जाए जब उन आरबीओ बनाए जाते हैं। यदि सभी वीडियो मेमोरी का एक बार उपयोग किया गया है और उनमें से कुछ अब आवंटित नहीं हैं, तो नव निर्मित आरबीओ में शायद कुछ पिछली सामग्री होगी। – loong
यह कल्पना नहीं है; वह एक विकी लेख है। यह नमूना [ओपनजीएल रजिस्ट्री] (http://www.opengl.org/registry/) पर पाया जाता है।लेकिन त्रुटि को इंगित करने के लिए धन्यवाद; मैं इसे ठीक कर दूंगा। –