2012-01-08 9 views
5

मुझे glDrawPixels छवि के परिणाम को स्केल करने की आवश्यकता है।glDrawPixels को कैसे स्केल करें?

मैं एक क्यूटी QGLWidget में glDrawPixels के साथ 640x480 पिक्सल छवि बफर ड्राइंग कर रहा हूं।

मैं PaintGL में निम्नलिखित करने के लिए tryed:

glScalef(windowWidth/640, windowHeight/480, 0); 
glDrawPixels(640,480,GL_RGB,GL_UNSIGNED_BYTE,frame); 

लेकिन यह काम नहीं करता।

void WdtRGB::paintGL() { 

     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

     // Setup the OpenGL viewpoint 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     glOrtho(0, windowWidth, windowHeight, 0, -1.0, 1.0); 

    glDepthMask(0); 
     //glRasterPos2i(0, 0); 
     glScalef(windowWidth/640, windowHeight/480, 0); 
     glDrawPixels(640,480,GL_RGB,GL_UNSIGNED_BYTE,frame); 
    } 

    //where windowWidth and windowHeight corresponds to the widget size. 
    /the init functions are: 

    void WdtRGB::initializeGL() { 

     glClearColor (0.8, 0.8, 0.8, 0.0); // Background to a grey tone 

     /* initialize viewing values */ 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 

     glOrtho(0, windowWidth, windowHeight, 0, -1.0, 1.0); 

     glEnable (GL_DEPTH_TEST); 

    } 

    void WdtRGB::resizeGL(int w, int h) { 
     float aspect=(float)w/(float)h; 

     windowWidth = w; 
     windowHeight = h; 
     glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
     glMatrixMode (GL_PROJECTION); 
     glLoadIdentity(); 

     if(w <= h) 
       glOrtho (-5.0, 5.0, -5.0/aspect, 5.0/aspect, -5.0, 5.0); 
     else 
       glOrtho (-5.0*aspect, 5.0*aspect, -5.0, 5.0, -5.0, 5.0); 

     //printf("\nresize"); 
     emit changeSize (); 
    } 

उत्तर

5

यह आप वास्तव में glDrawPixels बुला (के बजाय क्या करने की जरूरत की तरह लगता है) एक में अपनी छवि डेटा लोड करने के लिए है:

मैं ओपन व्यूपोर्ट और glOrtho के रूप में विजेट के आकार के साथ की स्थापना कर रहा हूँ बनावट और एक बनावट चौकोर खिड़की के आकार खींचें। इस तरह तो कुछ:

glGenTextures (1, &texID); 
glBindTextures (GL_TEXTURE_RECTANGLE_EXT, texID); 
glTexImage2D (GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, 640, 480, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, frame); 
glBegin (GL_QUADS); 
glTexCoord2f (0, 0); 
glVertex2f (0, 0); 
glTexCoord2f (640, 0); 
glVertex2f (windowWidth, 0); 
glTexCoord2f (640, 480); 
glVertex2f (windowWidth, windowHeight); 
glTexCoord2f (0, 480); 
glVertex2f (0, windowHeight); 
glEnd(); 

या कि बहुत ज्यादा काम नहीं है, तो glPixelZoom (windowWidth/640, windowHeight/480), चाल, भी कर सकता है।

+0

तुम बहुत muuch धन्यवाद, मैं अभी जाँच कर रहा हूँ – Herman

+1

मैंने पाया कि मैं एक glEnable जरूरत/glDisable (GL_TEXTURE_RECTANGLE) क्वाड पर बनावट प्राप्त करने के लिए प्रारंभ/अंत के आसपास जोड़ी है, और मुझे _EXT के बिना GL_TEXTURE_RECTANGLE का उपयोग करने की आवश्यकता है, लेकिन यह अन्यथा मेरे लिए भी पूरी तरह से काम करता है, धन्यवाद! : डी –

1

मुझे glDrawPixels छवि के परिणाम को स्केल करने की आवश्यकता है।

glDrawPixels सीधे फ्रेमबफर पर जाता है। इसलिए प्रत्येक आने वाली पिक्सेल को आउटपुट में 1: 1 मैप किया जाता है। एक समारोह है (आह, मैं आपको यह क्यों कह रहा हूं) glPixelZoom, जो आपको glDrawPixels ज़ूम करने की अनुमति देता है।

लेकिन मैं आपको आग्रह करता हूं कि gldrawPixels का उपयोग न करें!

इसके बजाय बनावट quads का उपयोग करें। glDrawPixels एक अवमूल्यन कार्य है, जो अब आधुनिक ओपनजीएल -3 द्वारा समर्थित नहीं है। और यहां तक ​​कि जब इसे बहिष्कृत नहीं किया गया था तब भी यह एक बहुत ही धीमा कार्य है। हर मामले में बनावट quads बेहतर हैं।

+0

ठीक है, मैं इसे जांचने जा रहा हूं, मैं वास्तव में आपकी मदद की सराहना करता हूं। मैं – Herman

+0

@datenwolf बनावट के लिए chaange मैं फ्रेम बफर सीधे कैसे उपयोग कर सकते हैं? मैं हार्डवेयर त्वरण के लिए एक अच्छी प्रॉक्सी के रूप में ईजीएल का उपयोग करके वास्तविक समय में अपनी पसंद का 2 डी बफर आकर्षित करना चाहता हूं। क्या इसके लिए उपयुक्त बनावट हैं? –

+1

@ आरआर-: ओपनजीएल आपको लिखने के लिए सीधे नहीं देता है (जैसा कि आपको फ्रेमबफर मेमोरी में पॉइंटर देने में) है। दक्षता कारणों के लिए प्रत्यक्ष लिखने से बचा जाना चाहिए। आप फ्रेमबफर को असीमित रूप से लिखना चाहते हैं। और ओपनजीएल के किसी भी संस्करण का उपयोग करके यह आपकी छवि को बनावट में लोड करके किया जाता है और एक बनावट क्वाड के लिए ड्राइंग कमांड जारी करता है। कमांड को कतारबद्ध किया गया है और अतुल्यकालिक रूप से निष्पादित किया गया है, ताकि आपकी सीपीयू प्रक्रिया किसी भी ग्राफिक्स घटनाओं से रुक गई न हो जिसकी प्रतीक्षा करनी पड़े। – datenwolf

2
बस आगे के संदर्भ के लिए

: इसके बजाय glScalef(windowWidth/640, windowHeight/480, 0);glDrawPixels इससे पहले कि आप एक पिक्सेल ज़ूम करना चाहिए करने का:

glRasterPos2i(0,0); 
GLint iViewport[4]; 
glGetIntegerv(GL_VIEWPORT, iViewport); 
glPixelZoom(iViewport[2]/640, iViewport[3]/480); 
glDrawPixels(640,480,GL_RGB,GL_UNSIGNED_BYTE,frame); 
संबंधित मुद्दे