如何在OpenGL中渲染超大质地

  • 本文关键字:OpenGL opengl graphics
  • 更新时间 :
  • 英文 :


我使用API glGetIntegerv来获得最大的视口和纹理大小。他们俩都返回16k x 16k像素。

这是代码:

GLint maxTexture,maxViewport;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexture);
glGetIntegerv(GL_MAX_VIEWPORT_DIMS, &maxViewport);

但是,我需要更大尺寸的纹理来显示一系列高分辨率的图像。我试图将视口大小设置为32K x 32k,并且程序成功运行。看来我从Api GlgetIntegerv获得的视口大小的最大尺寸并不完全正确。

,但我无法将纹理大小设置为大于16k x 16k的值。也许我应该尝试创建多个纹理单元,并且每个纹理单元的大小为16k x 16k。

某人提出了一个称为手动整体幻灯片成像的应用程序。这是超链接:

http://www.microvisioneer.com/

似乎超大型纹理已经在此应用程序中实现了。因此,OpenGL是解决我的问题的正确工具,还是还有其他解决方案?

更新:刚才我发现,当我将视口设置为32K x 32k且没有错误时,其真实大小仍然是16k x 16k。

考虑具有RGBA8类型。在C中看起来像这样:

uint8_t rgba[4] = {0x00, 0x44, 0x66, 0xff};

,但您也可以用:

来表示
uint32_t rgba = 0x004466ff;

类似于RGBA32的类型:

uint32_t rgba[4] = {0x00000000, 0x44000000, 0x66000000, 0xff000000};
// or
uint128_t _rgba = 0x000000004400000066000000ff000000; // assuming there is a uint128_t...

但是,您可以以任何方式对待这些位。您可以:

uint128_t rgba[4] = {tex1rgba, tex2rgba, tex3rgba, tex4rgba};

在上面的示例中,您已将TEX1 RGBA8数据放在红色通道中OpenGL内部RGBA32纹理,绿色频道中的Tex2等。假设这些纹理在现实生活中以2x2的方式逐渐边缘,TexCoord(0.1,0.1)将在TexCoord 2*(0.1,0.1)的红色通道中绘制RGBA8值。DexCoord(0.6,0.7)以2*(0.6-0.5,0.7-0.5)的Alpha通道中的RGBA8映射,假设Alpha通道中的纹理位于红色通道中的纹理上。

我自己朝相反的方向使用了这项技术,以使我的应用程序支持16位亮度(L16或R16)在仅支持8位通道的平台上。从本质上讲,我将16位单个通道纹理加载到8位双通道纹理中,然后将其分为高/低字。

注意,您可以在执行此操作时使用任何纹理过滤,例如gl_linear。你必须过滤自己。根据我的经验,这在实践中不是一个很大的问题。

相关内容

  • 没有找到相关文章

最新更新