如何在OpenGL中渲染超大尺寸纹理

时间:2017-09-15 08:19:21

标签: 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。

有人提出了一个名为Manual Whole Slide Imaging的应用程序。 这是超链接:

http://www.microvisioneer.com/

在这个应用程序中似乎已经实现了超大尺寸纹理。 那么OpenGL是解决我问题的正确工具还是有其他解决方案?

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

1 个答案:

答案 0 :(得分:0)

考虑使用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值。 Texcoord(0.6,0.7)映射到2 *(0.6-0.5,0.7-0.5)的alpha通道中的rgba8,假设alpha通道中的纹理位于红色通道中纹理的对角线上。

我自己在相反的方向上使用这种技术,使我的应用程序在仅支持8位通道的平台上支持16位亮度(L16或R16)。基本上我将一个16位单通道纹理加载到一个8位双通道纹理中,然后将它作为高/低字分割在着色器中。

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