代码之家  ›  专栏  ›  技术社区  ›  ssube

OpenGL,将纹理从图像应用到等值面

  •  3
  • ssube  · 技术社区  · 14 年前

    卷中的每个点表示单个数据单元,每个数据单元可能具有不同的属性。为了简化,我考虑将它们分类为“类型”,并为每种类型分配一个纹理(或单个大型纹理图集的一部分)。

    我的问题是我不知道如何生成合适的坐标。我可以在type类中存储类型纹理的位置并使用它,但是接缝将被严重拉伸(如果两个相邻点使用atlas的不同部分)。如果可能的话,我想混合接缝上的纹理,但我不确定最好的方式来做到这一点。混合是可选的,但是我需要以某种方式对顶点进行纹理处理。对于每种类型,可以将几何体分割为多个部分,或者复制顶点以进行纹理处理,但这是不可取的。

    如果可能的话,我想避免使用着色器,但如果需要,我可以使用顶点和/或片段着色器来进行纹理混合。如果我真的使用了材质球,那么最有效的方法是什么来判断它是纹理还是要采样的部分?似乎通过参数传递类型是最简单的方法,但可能很慢。

    我的体积相对较小,每个维度都有8-16个点(为了加快生成速度,我将它们保持在较小的范围内,但在给定的时间内屏幕上有很多)。我简要地考虑了使等值面的分辨率是体积的两倍,因此每个点都有更多的顶点(理论上是8个),这可以简化纹理。不过,这似乎不会让混合变得更容易。

    Visualization Library 用于OpenGL及其marching cubes和volume系统。我已经生成了很好的几何体,只需要找出如何纹理它。

    有没有办法有效地做到这一点,如果有,怎么办?如果没有,有没有人有更好的方法来处理一个卷纹理的想法?

    编辑

    为了帮助澄清这个问题,我将添加一些例子。他们可能只是把事情搞混了,所以把一切都看得比确定的事实更重要,如果可能的话,这些也会有帮助。

    我的几何图形总是以立方体为单位(加载、生成和保存在立方体中)。如果形状影响可能的解决方案,就这样。

    阴影是一个快速和简单的解决方案,虽然我想避免他们,如果可能的话,正如我之前提到的。在固定功能管道中可用的东西是可取的,主要是因为兼容性和开发时间略有增加。因为这只是一个小的增加,我将与阴影和多过程渲染,如果必要的话。

    不确定是否需要其他澄清,但我会根据需要更新问题。

    4 回复  |  直到 14 年前
        1
  •  2
  •   Tommy    14 年前

    关于问题的纹理组合部分:

    你研究过3d纹理吗?当我们在讨论行进立方体时,我应该马上说,我并不是在讨论体积纹理。相反,您可以将所有二维纹理叠加到三维纹理中。然后对每个纹理坐标进行编码,使其成为二维位置,并将其引用的纹理作为第三个坐标。如果你的纹理通常是那种类型的,从逻辑上讲,从一种模式转换到另一种模式,你必须通过中间层。

    一个明显的使用示例是纹理映射到一个简单的高度贴图,上面可能有一个雪纹理,下面有一个岩石纹理,下面是一个草纹理,下面是一个水纹理。如果引用水的顶点与引用雪的顶点相邻,则几何体填充可以通过岩石和草纹理过渡。

    您可能需要准备一个完整的绘制深度缓冲区(颜色遮罩全部设置为拒绝对颜色缓冲区的更改),然后切换到glu等深度测试,并在禁用对深度缓冲区的写入的情况下再次绘制。通过完全相同的变换绘制完全相同的几何图形应产生完全相同的深度值,而不考虑精度和精度问题。如果有问题,请使用glPolygonOffset。

    常用且简单的映射有圆柱形、长方体和球形。概念化您的形状由圆柱体、长方体或球体限定,具有从表面点到纹理位置的定义良好的映射。然后,对于形状中的每个顶点,从其开始并沿法线向外移动,直到碰到边界几何体为止。然后获取将位于边界几何体上该位置的纹理位置。

    我想有一个潜在的问题是,在立方体行进之后,法线往往不是很好,但我敢打赌你比我更了解这个问题。

        2
  •  1
  •   timday    14 年前

    这是一个既困难又有趣的问题。

    最简单的方法是通过使用3D纹理贴图来完全避免这个问题,特别是如果您只想向等高线几何体添加一些随机的曲面细节。在着色器中实现的基于Perlin噪波的程序纹理对此非常有效。

    困难的方法是研究 conformal texture mapping (也称为 conformal surface parametrization ),其目的是在二维纹理空间和三维几何体的表面之间生成某种意义上最优(最小扭曲)的映射。这个 paper 有一些好照片。注意几何的拓扑结构是非常重要的;很容易生成一个共形映射来将一个纹理映射到一个像大脑一样的封闭表面上,对于更高的 genus 需要引入剪切/撕裂/连接的对象。

        3
  •  0
  •   Ben Jackson    14 年前

    您可能想尝试在Blender之类的工具中创建网格的UV贴图,以查看它们是如何做到的。如果我理解你的问题,你有一个三维场,它定义了一个实体体积和一个(连续的)颜色。您已经从体积创建了一个网格,现在需要使用从连续颜色空间提取的纹理将网格映射到二维纹理。在一个工具中,你可以在三维网格中定义“接缝”,你可以把它们分开,这样整个网格就可以平放,形成一个UV贴图。接缝处的纹理可能存在锯齿,因此当渲染网格时,这些接缝处的纹理也将不连续(即三角形条带无法穿过接缝,因为它是纹理中的不连续)。

        4
  •  0
  •   ssube    14 年前

    由于纹理和一些约束的问题,我选择编写一个不同的算法来构建几何体,并在生成曲面时直接处理纹理。它的平滑度比行军立方体稍低,但允许我以适合我的项目的方式应用texcoords(而且速度更快)。