如何确定 glTexImage3D 的尺寸参数?

Posted

技术标签:

【中文标题】如何确定 glTexImage3D 的尺寸参数?【英文标题】:How do I determine the dimension arguments for glTexImage3D? 【发布时间】:2014-11-29 00:05:42 【问题描述】:

我正在从事一个图形项目,涉及使用 3D 纹理对以直线网格形式存储的数据进行一些体积渲染,我对 glTexImage3D 的宽度、高度和深度参数有点困惑。对于一维纹理,我知道你可以使用这样的东西:

glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, 数据);

其中宽度是每个颜色流的 256 个可能值。在这里,我仍然使用无符号字节形式的颜色(这里纹理的主要目的仍然是插入网格中点的颜色以及透明度),所以对我来说它是有意义的的参数仍然是 256。它是一个 64 X 64 X 64 的网格,所以其中一个参数(也许是深度?)是 64 是有道理的,但我不确定第三个,或者即使我我在正确的轨道上。谁能启发我正确使用这三个参数?我看了这两个讨论,但还是一头雾水:

regarding glTexImage3D

OPENGL how to use glTexImage3D function

【问题讨论】:

您打算如何从 3D 纹理中渲染日期。 OpenGL 3D 纹理不是“神奇的”体积光栅化器。绘制常规 OpenGL 基元时,您可以从体积中切出“切片”,但它不会自动进行体积渲染。为此,您必须实现某种体积光线投射器或类似的东西。 “其中宽度是每个颜色流的 256 个可能值”——完全误解了它的作用。 width(以及高度和深度)参数告诉我们要为纹理分配多少像素。 【参考方案1】:

您似乎误解了 1D 案例。在您的示例中,256 是 1D 纹理的大小,即纹素的数量。

每个颜色分量的可能值的数量由内部格式给出,这是第三个参数。 GL_RGB 实际上将颜色深度应由实现决定。它支持与旧代码的向后兼容性。如果您为内部格式指定像 GL_RGB8 这样的大小格式会更清楚,它要求每个颜色分量 8 位,这对应于 R、G 和 B 的 256 个可能值。

对于 3D 情况,如果您想要一个 64 x 64 x 64 的网格,您只需将 3 个维度(宽度、高度和深度)中的每个维度的大小指定为 64。说这个尺寸,使用 RGBA 和 8 位颜色深度,调用是:

glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 64, 64, 64, 0,
             GL_RGBA, GL_UNSIGNED_BYTE, data);

【讨论】:

我明白了。我想这只是一个快乐的巧合,使用 glTexImage1D 调用之前有效,然后。将每个参数设置为 64 实际上是我尝试的第一件事,但它只是给了我一个完全黑屏。到目前为止,给我最好的图像的是使用这些: glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, 16, 256, 64, 0, GL_RGB, GL_UNSIGNED_BYTE, RGBColors);我应该注意到它是一个规则网格(即它使用规则间距),但它不是一个单位网格。不过,我正在尝试将我的 glTexCoord3f 格式化为一个。 这对于 16x256x64 的 RGB 值网格是正确的。你说你有透明胶片,所以我想你可能有 RGBA 数据。实际上,体积渲染更常见的是使用仅包含强度的单通道数据,并将其映射到具有传递函数的颜色。但这实际上取决于您输入数据的格式。最后,它应该看起来像这样:retokoradi.com/volume-rendering :) 你对透明胶片的假设是正确的——我只是想在添加透明胶片之前让颜色正常工作。我实际上也在使用传递函数 - *data 参数来自我将它应用于网格上点的字段值。 啊,我没想到更改这些参数会影响我需要的相机设置。我认为这实际上是我的主要错误之一。谢谢,雷托。

以上是关于如何确定 glTexImage3D 的尺寸参数?的主要内容,如果未能解决你的问题,请参考以下文章

glTexImage3D 在 QT 中崩溃

来自 glTexImage3D 调用的无效操作错误

我可以使用ImageMagick来确定X轴和Y轴的长度吗?

机加尺寸精度等级有多少级?车床加工能达到啥精度等级?怎样确定一个零件的加工工时?

如何不用标定板来确定相机的外参矩阵

确定偏移圆弧的中心点