【问题标题】:how to use glDrawPixels to render a picture as a background如何使用 glDrawPixels 将图片渲染为背景
【发布时间】:2012-05-22 12:53:32
【问题描述】:

事情是这样的:我想加载一张图片作为填充整个视口的背景。无论相机朝向何处,此背景都应始终朝向相机。 首先我很自然地认为使用纹理作为背景,我的代码如下:

glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0,1,0,1,0,1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();

glBindTexture(GL_TEXTURE_2D, myimage.GetID());
glEnable(GL_TEXTURE_2D);

glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(0, 0);
glTexCoord2f(1, 0); glVertex2f(1, 0);
glTexCoord2f(1, 1); glVertex2f(1, 1);
glTexCoord2f(0, 1); glVertex2f(0, 1);
glEnd();

glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);

相信我,myimage 是一个 CIMAGE 类,可以将图片加载到纹理中,效果很好。 但是,由于某些未知原因,我的应用程序无法将纹理加载到矩形中。 (我在这里描述了这个问题click)结果,我只能在我的视口周围看到一个矩形框。

所以,我想出了另一个解决方案。

我使用 glDrawPixels 而不是纹理。我的代码如下:

glRasterPos2i(0, 0);
glDrawPixels(myimage.GetWidth(), myimage.GetHeight(), (myimage.GetBPP() == 24)?GL_RGB:GL_RGBA, GL_UNSIGNED_BYTE, 
    myimage.GetData());

图片出现了!然而,这张照片并不总是面对我的相机。它只出现在一个特定的方向。你知道,就像场景中的一个物体,而不是一个总是面向相机的背景。

那么有人知道如何使用 glDrawPixels 来实现背景吗?

顺便说一句,我认为这个背景不是放置在 3D 场景中的物体。所以广告牌可能不是我的解决方案。同样,此背景填充了整个视口,并且始终面向摄像机。

【问题讨论】:

  • 您正在加载的图片的宽度/高度是多少?
  • 我猜glDrawPixels 尝试使用当前的光栅位置(受通常的转换管道影响)。但无论如何,不​​要使用glDrawPixels 而不是纹理四边形。而是修复你的纹理代码,也许正如 ananthonline 建议的那样。

标签: opengl textures texture-mapping gldrawpixels


【解决方案1】:

纹理加载可能不起作用的原因之一是它可能没有二维的幂。试试正方形 256x256 纹理(或类似的),看看这是否是问题所在。在此处查看有关Rectangle Textures 的更多信息。

回到你的背景问题 - 正确的方法是

  1. 设置一个覆盖整个屏幕的正交投影/视口。

    glViewport(0,0,nw,nh);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,1,0,1,0,1);
    glMatrixMode(GL_MODELVIEW);
    
  2. 禁用深度测试

  3. 使用您加载的纹理/纹理矩形绘制全屏四边形。

    glBegin(GL_QUADS);
    glVertex2f(0,0);
    glVertex2f(1,0);
    glVertex2f(1,1);
    glVertex2f(0,1);
    glEnd();
    
  4. 设置您的常规投影/模型视图并继续。

希望这会有所帮助!

【讨论】:

  • 谢谢anantholine,你很好。但不幸的是,我的图片尺寸是512X512。我认为这是一个二维的战俘。而让我沮丧的是这张图片可以作为纹理加载到另一个小项目(NeHe tut.5)中。更糟糕的是,我的项目最初加载了一些纹理,效果很好。但是我以同样的方式加载图片,我失败了。你能再给我一个关于我的问题的提示吗?
猜你喜欢
  • 1970-01-01
  • 2014-11-20
  • 2017-06-01
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
相关资源
最近更新 更多