2012-01-08 38 views
5

Tôi cần chia tỷ lệ kết quả của hình ảnh glDrawPixels.Làm cách nào để mở rộng quy mô glDrawPixels?

Tôi đang vẽ bộ đệm hình ảnh 640x480 pixel với glDrawPixels trong Qt QGLWidget.

Tôi tryed làm như sau trong PaintGL:

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

Nhưng nó không hoạt động.

Tôi đang thiết lập các khung nhìn OpenGL và glOrtho với kích thước của widget như:

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 (); 
    } 

Trả lời

5

Nghe có vẻ giống như những gì bạn thực sự cần phải làm gì thay vì gọi glDrawPixels() là để tải dữ liệu hình ảnh của bạn thành một kết cấu và vẽ một kết cấu quad kích thước của cửa sổ. Vì vậy, một cái gì đó như thế này:

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(); 

Hoặc nếu đó là quá nhiều công việc, glPixelZoom (windowWidth/640, windowHeight/480), có thể làm các trick, quá.

+0

Cảm ơn bạn rất muuch, tôi đang kiểm tra nó ngay bây giờ – Herman

+1

tôi thấy rằng tôi cần một người glEnable/glDisable (GL_TEXTURE_RECTANGLE) cặp xung quanh bắt đầu/kết thúc để có được các kết cấu áp dụng cho quads, và rằng tôi cần thiết để sử dụng GL_TEXTURE_RECTANGLE mà không có _EXT, nhưng điều này nếu không làm việc hoàn hảo cho tôi quá, cảm ơn! : D –

1

Tôi cần chia tỷ lệ kết quả của hình ảnh glDrawPixels.

glDrawPixels trực tiếp chuyển đến bộ đệm khung. Vì vậy, mọi điểm ảnh đến đều được ánh xạ 1: 1 đến đầu ra. Có một chức năng (ah, tại sao tôi nói cho bạn điều này) glPixelZoom, cho phép bạn phóng to glDrawPixels.

NHƯNG tôi mong bạn, không sử dụng glDrawPixels!

Sử dụng kết cấu hình chữ nhật thay thế. glDrawPixels là một hàm bị khấu hao, không còn được hỗ trợ bởi OpenGL-3 hiện đại. Và ngay cả khi nó không bị phản đối thì nó vẫn là một chức năng rất chậm. Quads kết cấu tốt hơn trong mọi khía cạnh.

+0

Ok, tôi sẽ kiểm tra xem, tôi thực sự đánh giá cao sự giúp đỡ của bạn. Tôi sẽ chaange để kết cấu – Herman

+0

@ datenwolf làm cách nào tôi có thể truy cập bộ đệm khung trực tiếp? Tôi muốn vẽ một bộ đệm 2d của sự lựa chọn của tôi trong thời gian thực, sử dụng EGL như một proxy tốt cho tăng tốc phần cứng. Kết cấu có phù hợp cho điều này không? –

+1

@ rr-: OpenGL không cung cấp cho bạn trực tiếp (như cung cấp cho bạn một con trỏ đến bộ nhớ bộ đệm khung) để ghi vào. Cũng vì lý do hiệu quả ghi trực tiếp là để tránh. Bạn muốn viết không đồng bộ vào bộ đệm khung. Và sử dụng bất kỳ biến thể của OpenGL này được thực hiện bằng cách tải hình ảnh của bạn vào một kết cấu và issung một lệnh vẽ cho một quad kết cấu. Lệnh được xếp hàng đợi và thực hiện không đồng bộ, do đó quá trình CPU của bạn không bị trì hoãn bởi bất kỳ sự kiện đồ họa nào mà nó phải chờ đợi. – datenwolf

2

Chỉ cần để tham khảo thêm: Thay vì làm glScalef(windowWidth/640, windowHeight/480, 0); trước glDrawPixels bạn nên làm một zoom điểm ảnh:

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); 
Các vấn đề liên quan