当前位置:  开发笔记 > 编程语言 > 正文

在OpenGL中显示大图像的首选方法是什么

如何解决《在OpenGL中显示大图像的首选方法是什么》经验,为你挑选了1个好方法。

我有几次这个问题.假设我想在OpenGL上下文中显示一个启动画面或其他东西(或DirectX就此而言,它更像是一个概念性的东西),现在,我可以只加载2048x2048纹理,并希望显卡可以应对它(现在我认为大部分都会这样),但随着老式显卡的增长,我有这种不良的倾向于我并且告诉我不应该使用那么大的纹理.

现在的首选方式是什么?是将它放入视频内存,平铺它,还是让CPU完成工作和glDrawPixels?还是更精细的东西?



1> codelogic..:

如果这是一个没有动画的单帧初始图像,那么使用它是没有害处的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驱动程序支持的最大纹理大小,如果您的图像不适合,您至少有两个选项:

图像平铺:将图像拆分为较小的支持块后使用多个四边形.像闪屏这样的图像拼贴不应该太棘手.您可以使用glPixelStorei的GL_PACK_ROW_LENGTH参数将较大图像的部分加载到纹理中.

图像大小调整:调整图像大小以适应最大支持的纹理大小.还有一个GLU辅助函数可以为你做这个, gluScaleImage.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有