【问题标题】:What is the preferred way to show large images in OpenGL在 OpenGL 中显示大图像的首选方式是什么
【发布时间】:2010-09-30 08:05:53
【问题描述】:

我遇到过几次这个问题。假设我想在 OpenGL 上下文中显示闪屏或其他东西(或者 DirectX,这更像是一个概念性的东西),现在,我可以只加载 2048x2048 纹理并希望显卡能够应付它(我想现在大部分都会),但是随着老式显卡的增长,我有一种糟糕的良心靠在我身上,告诉我不应该使用那么大的纹理。

当今的首选方式是什么?是把那个东西塞进视频内存,平铺,还是让 CPU 完成工作和 glDrawPixels?或者更精细的东西?

【问题讨论】:

  • glDrawPixels 真的很慢,你肯定不会用。
  • 我实际上把 glDrawPixels 扔在那里更多是为了颜色...... :)

标签: opengl graphics textures


【解决方案1】:

如果这是一个没有动画的单帧初始图像,那么使用glDrawPixels 并没有什么坏处。如果性能至关重要并且您需要使用纹理,那么正确的方法是在运行时确定支持的最大纹理大小,使用代理纹理。

GLint width = 0;
while ( 0 == width ) {  /* use a better condition to prevent possible endless loop */
    glTexImage2D(GL_PROXY_TEXTURE_2D, 
                      0,                /* mip map level */
                      GL_RGBA,          /* internal format */
                      desiredWidth,     /* width of image */
                      desiredHeight,    /* height of image */
                      0,                /* texture border */
                      GL_RGBA           /* pixel data format, */ 
                      GL_UNSIGNED_BYTE, /* pixel data type */
                      NULL              /* null pointer because this a proxy texture */
    );

    /* the queried width will NOT be 0, if the texture format is supported */
    glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);

    desiredWidth /= 2; desiredHeight /= 2;
}

一旦您知道系统的 OpenGL 驱动程序支持的最大纹理大小,如果您的图像不适合,您至少有两个选择:

  • 图像平铺:将图像分割成更小的支持块后使用多个四边形。像闪屏这样的图像平铺不应该太棘手。您可以使用glPixelStoreiGL_PACK_ROW_LENGTH 参数将较大图像的部分加载到纹理中。
  • 图像大小调整:调整图像大小以适应支持的最大纹理大小。甚至还有一个 GLU 辅助函数可以为您执行此操作,gluScaleImage

【讨论】:

【解决方案2】:

我认为没有内置的 opengl 函数,但您可能会找到一个库(或自己编写函数)将图像分解成更小的块,然后打印以筛选更小的块(128x128 瓷砖或类似)。

我在使用 Slick2D 进行 Java 游戏时遇到了问题。您可以查看他们的“BigImage”课程以获取想法here

【讨论】:

    猜你喜欢
    • 2018-08-10
    • 1970-01-01
    • 2016-02-28
    • 2014-03-31
    • 2016-05-21
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多