在OpenGL中的窗口上显示两个不同的图像
Posted
技术标签:
【中文标题】在OpenGL中的窗口上显示两个不同的图像【英文标题】:Displayin two different images on a window in OpenGL 【发布时间】:2014-03-05 22:01:35 【问题描述】:我正在尝试使用 OpenGL 在窗口上显示两个不同的图像。如下图所示。
窗口左侧的第一张图片:img [nc x nr]
窗口右侧的第二张图片:img2 [nc x ns]
图片
我为显示例程编写了以下代码:
void display(void)
///////////////////First Image////////////////////////
glViewport( (GLsizei) 0, (GLsizei) 0, (GLsizei) nc, (GLsizei) nr );
glClear(GL_COLOR_BUFFER_BIT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glRasterPos2i(0, 0);
glDrawPixels(nc,nr, GL_RGB, GL_UNSIGNED_BYTE, img);
///////////////////Second Image////////////////////////
glViewport( (GLsizei) 0, (GLsizei) nc, (GLsizei) nc, (GLsizei) ns );
glClear(GL_COLOR_BUFFER_BIT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glRasterPos2i(0, nc);
glDrawPixels(nc,ns, GL_RGB, GL_UNSIGNED_BYTE, img2);
//////////////////////////////////////////////////////
glutSwapBuffers();
当我运行程序时,窗口什么也不显示;但是当我注释掉第二张图片的显示代码时,我可以在窗口左侧看到图片1。
谁能看到我的代码有什么问题?
【问题讨论】:
您是否尝试过让视口足够大以容纳两者并仅绘制它们?我感觉您的第二个视口更改隐藏了您绘制的第一张图像。 视口只需要设置一次,您不应该重置它,因为这将覆盖原始视点。理想情况下,您应该将视口除以 2(每个图像的一半),然后缩放两个图像以适应视口的一半 @Borgleader:我将窗口初始化为:glutInitWindowSize(2*nc,nr); @sara_123 我说的是视口。将视口设为该大小,然后在不更改的情况下绘制这两个东西 @sara_123 这更可能是巧合。把视口想象成你的眼睛。你的眼睛可以同时看到多个物体,每个物体都不需要一双新的眼睛来看到它。从逻辑上考虑,如果您有 3000 个模型,则需要设置 3000 个视口....在设置和渲染时都非常难以管理且速度非常慢 【参考方案1】:void display(void)
// Size the viewport to be big enough for two images
glViewport( (GLsizei) 0, (GLsizei) 0, (GLsizei) screen_width, (GLsizei) screen_height );
glClear(GL_COLOR_BUFFER_BIT);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
// Position first image starting at 0, 0
glRasterPos2i(0, 0);
// Get the width and height of image as first two params
glDrawPixels(img.width,img.height, GL_RGB, GL_UNSIGNED_BYTE, img);
// Position second image starting after the width of the first image
glRasterPos2i(img.width, 0);
// get width and height of second image as first two params
glDrawPixels(img2.width,img2.height, GL_RGB, GL_UNSIGNED_BYTE, img2);
glutSwapBuffers();
这是一般的想法。显然 screen_height 等在您的应用程序中的名称不同,但视口应设置为屏幕的大小。 Raster 位置应该是图像的起始位置,DrawPixels 的前 2 个参数应该是图像的宽度和高度。每个图像不需要自己的视口,因为当图像/模型的数量增加时,这将非常难以管理(并且非常缓慢)。
【讨论】:
你能给我推荐一本好书或网站来了解更多关于 OpenGL 的信息吗? @const_ref:使用视口设置要绘制的图像的位置和缩放(以像素为单位)是完全合理的。此外 glDrawPixels 已被弃用,并已从现代 OpenGL 中删除,因此根本不要使用它。【参考方案2】:实际上,您定义了两次视口。所以第一个视口的效果不再有效。只定义一个具有屏幕高度和宽度的视口。
【讨论】:
以上是关于在OpenGL中的窗口上显示两个不同的图像的主要内容,如果未能解决你的问题,请参考以下文章
使用 ubuntu 在不同的显示器上共享 opengl 上下文