我需要缩放glDrawPixels图像的结果。
我在Qt QGLWidget中使用glDrawPixels绘制一个640x480像素的图像缓冲区。
我尝试在PaintGL中执行以下操作:
glScalef(windowWidth/640, windowHeight/480, 0);
glDrawPixels(640,480,GL_RGB,GL_UNSIGNED_BYTE,frame);
但它不起作用。
我将OpenGL视口和glOrtho设置为小部件的大小:
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 ( );
}
答案 0 :(得分:5)
这听起来像你实际需要做的而不是调用glDrawPixels()是将图像数据加载到纹理中并绘制窗口大小的纹理四边形。所以像这样:
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)也可以做到这一点。
答案 1 :(得分: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);
答案 2 :(得分:1)
我需要缩放glDrawPixels图像的结果。
glDrawPixels直接进入帧缓冲区。因此每个输入像素都以1:1的比例映射到输出。有一个函数(啊,为什么我告诉你这个) glPixelZoom ,它允许你缩放glDrawPixels。
但我劝你,不要使用glDrawPixels!
改为使用纹理四边形。 glDrawPixels是一种折旧函数,现代OpenGL-3不再支持它。即使它没有被弃用,它仍然是一个非常缓慢的功能。纹理四边形在各方面都更好。