2017-09-15 445 views
0

我使用API​​ glGetIntegerv来获得视口和纹理的最大尺寸。他们都返回16K x 16K像素。如何在OpenGL中渲染超大尺寸纹理

这里是代码:

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。

+1

你是什么意思的“1024 * 16 * 1024 * 16”大小?您使用的查询为* width *(和* height * for viewport)提供了一个值您可以查找由卡片返回的值[here](http://opengl.gpuinfo.org/gl_stats_caps_single.php?listreportsbycap=GL_MAX_TEXTURE_SIZE)值足以满足所安装硬件的最大显示尺寸。 – Ripi2

+0

As @ Ripi2提到。你在说什么是关于视口,它没有任何纹理。纹理将基于硬件具有最大尺寸,并且可以将任何尺寸渲染到任何尺寸的视口。 – Ketan

+0

根据规格,glViewport无声地夹持到支持的范围。这不是一个错误。 – Andreas

回答

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在绿色通道等。假设纹理在现实生活中以2×2的方式边缘化,texcoord(0.1,0.1)将在texcoord 2 *(0.1,0.1)的红色通道中映射rgba8值。假设alpha通道中的纹理与红色通道中的纹理对角定位,则Texcoord(0.6,0.7)映射到alpha通道中的rgba8(2 *(0.6-0.5,0.7-0.5))。

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

注意在做这件事时你不能使用任何纹理过滤,比如GL_LINEAR。你必须过滤自己。根据我的经验,这在实践中并不是一个很大的问题。