我有一个程序,我需要将二维纹理(简单图像)应用于使用行进立方体算法生成的表面。我可以访问几何体并且可以相对容易地添加纹理坐标,但生成坐标的最佳方法是逃避我。
卷中的每个点代表一个数据单元,每个数据单元可能具有不同的属性。为简化起见,我正在考虑将它们分类为“类型”并为每种类型指定纹理(或单个大纹理图集的一部分)。
我的问题是我不知道如何生成适当的坐标。我可以在类型类中存储类型纹理的位置并使用它,但接缝将被拉伸(如果两个相邻点使用图集的不同部分)。如果可能的话,我想在接缝处混合纹理,但我不确定这样做的最佳方式。混合是可选的,但我需要以某种方式纹理顶点。将几何体拆分为每种类型的零件,或复制顶点以进行纹理化是可能的,但不可取的。
如果可能的话,我想避免使用着色器,但如果需要,我可以使用顶点和/或片段着色器来进行纹理混合。如果我使用着色器,那么告诉它的最有效方法是纹理还是部分样本?似乎通过参数传递类型将是最简单的方法,但可能很慢。
我的体积相对较小,每个维度都有8-16个点(我将它们保持较小以加快生成速度,但在给定时间内屏幕上有很多)。我简单地考虑将等值面设置为体积分辨率的两倍,因此每个点都有更多顶点(理论上为8),这可以简化纹理。但是,这似乎不会使混合变得更容易。
为了构建表面,我使用Visualization Library用于OpenGL及其行进立方体和体积系统。我生成的几何图形很好,只需要弄清楚如何纹理它。
有没有办法有效地做到这一点,如果是这样的话?如果没有,有没有人知道更好的方法来处理卷的纹理?
编辑:请注意,纹理不仅仅是渐变的颜色。它实际上是一种纹理,通常带有图案。因此,绘制它的难度,梯度将是微不足道的。
编辑2:为了帮助澄清问题,我将添加一些示例。他们可能只是混淆了一些事情,所以考虑一下上面的确定事实,如果可以的话,这些也是有帮助的。
我的几何体是立方体,总是(加载,生成并保存在立方体中)。如果形状影响可能的解决方案,那就是它。
我需要将纹理(由图案和/或颜色组成的独特图案,取决于点的“类型”)应用于几何图形,其技术类似于对地形进行的图示(这不是地形,但是,所以我不知道是否可以使用相同的技术)。
着色器是一种快速简便的解决方案,但如果可能的话,我想尽量避免使用它们,正如我之前提到的那样。在固定功能管道中可用的东西是可取的,主要是因为兼容性和开发时间的微小增加。由于它只是一个小的增加,如果有必要,我将使用着色器和多通道渲染。
不确定是否有必要进行其他澄清,但我会根据需要更新问题。
答案 0 :(得分:2)
在问题的纹理组合部分:
你看过3D纹理吗?当我们谈论行进立方体时,我应该立即说我明确没有谈论体积纹理。而是将所有2d纹理堆叠成3d纹理。然后,您将每个纹理坐标编码为它将是2d位置,并将其引用的纹理编码为第三个坐标。如果你的纹理通常是这样的类型,它在逻辑上从一种类型的模式转换到另一种模式,你必须通过中间体。
一个明显的使用示例是纹理映射到简单的高度贴图 - 您可能在顶部有雪纹理,在其下方有岩石纹理,在其下方有草地纹理,在底部有水纹理。如果引用水的顶点位于引用雪的顶点旁边,则几何填充可以通过岩石和草纹理过渡。
另一种方法是使用添加剂混合在多次通过中进行。对于每个纹理,绘制使用该纹理的每个面,并将淡入淡出绘制为透明,从任何面切换到从一个纹理切换到另一个纹理。
您可能希望使用完整绘图准备深度缓冲区(颜色掩码全部设置为拒绝对颜色缓冲区的更改)然后切换到GL_EQUAL深度测试并再次绘制并禁用深度缓冲区。通过完全相同的变换绘制完全相同的几何体应该产生完全相同的深度值,而不管精度和精度的问题。如果您有问题,请使用glPolygonOffset。
在坐标部分:
流行且易于映射的是圆柱形,盒形和球形。概念化您的形状由圆柱,框或球体限定,并具有从表面点到纹理位置的明确定义的映射。然后对于形状中的每个顶点,从它开始并按照法线向外,直到敲击边界几何体。然后抓住将在边界几何体上的该位置的纹理位置。
我想有一个潜在的问题,即在行进立方体之后法线往往不会很明亮,但我会打赌你比我更了解这个问题。
答案 1 :(得分:1)
这是一个艰难而有趣的问题。
最简单的方法是使用3D纹理贴图完全避免此问题,特别是如果您只想在等值面几何体中添加一些随机曲面细节。在着色器中实现的基于Perlin噪声的程序纹理对此非常有效。
困难的方法是研究conformal texture mapping(也称为conformal surface parametrization)的各种算法,这些算法旨在生成2D纹理空间与3D几何体表面之间的映射。感觉最佳(最不扭曲)。这个paper有一些很好的照片。请注意,几何体的拓扑结构非常重要;很容易生成一个共形映射来将纹理映射到像大脑这样的封闭表面上,对于需要引入剪切/撕裂/连接的高genus个对象来说要复杂得多。
答案 2 :(得分:0)
您可能想尝试在像Blender这样的工具中制作网格物体的UV贴图,以了解它们是如何做到的。如果我理解你的问题,你有一个3D字段,它定义一个实体和一个(连续)颜色。您已经从体积创建了一个网格物体,现在您需要将网格物体UV映射到2D纹理,并使用从连续颜色空间中提取的纹素。在工具中,您可以在3D网格中定义“接缝”,您可以将其拆开,以便整个网格可以平放以制作UV贴图。在接缝处的纹理中可能存在锯齿,因此当渲染网格时,它们在这些接缝处也会不连续(即三角形条不能越过接缝,因为它是纹理中的不连续)。
我不知道任何用于展平网格的正式方法,但您可以想象沿着接缝切割它然后将整个事物视为弹簧/约束系统,将其放到平坦的表面上。我一切都是为了解决困难的问题。 ; - )
答案 3 :(得分:0)
由于纹理的问题和我所拥有的一些约束,我选择编写一个不同的算法来构建几何体,并在生成曲面时直接处理纹理。它比行进立方体更不平滑,但允许我以适用于我的项目的方式应用texcoords(并且速度更快)。
对于任何对纹理行进立方体感兴趣或者只是混合纹理感兴趣的人来说,Tommy的答案是一种非常有趣的技术,并且发布的timday链接是平整网格纹理的优秀资源。感谢他们两人的回答,希望他们能够对他人有用。 :)