我有几次这个问题。假设我想在OpenGL上下文中显示一个启动画面或其他东西(或DirectX就此而言,它更像是一个概念性的东西),现在,我可以只加载2048x2048纹理,并希望显卡可以应付它(现在我认为大部分都会这样),但随着老式显卡的增长,我有这种不良的倾向于我并且告诉我不应该使用那么大的纹理。
现在的首选方式是什么?是将它放入视频内存,平铺它,还是让CPU完成工作和glDrawPixels?还是更精细的东西?
答案 0 :(得分:10)
如果这是没有动画的单帧启动图像,那么使用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驱动程序支持的最大纹理大小,如果您的图像不适合,则至少有两个选项:
GL_PACK_ROW_LENGTH
参数将较大图片的部分加载到纹理中。答案 1 :(得分:0)