在3D模型的纹理绘画

时间:2016-02-02 08:53:10

标签: opengl textures paint projection brush

我知道这里有几个类似的问题,但答案并不能帮助我实现的目标。正如标题所示,我希望在OpenGL中将纹理投影到3D模型(准确地说是其UV映射纹理)上。此视频中显示了最佳示例 - https://www.youtube.com/watch?v=pT4bx4J4NQQ

在评论中,作者提到他将枪的每个像素投射到UV空间并更新原始纹理"。我假设他通过渲染额外的UV传递来实现这一点,该传递允许他用刷子纹理中的像素替换可见像素。像往常一样,说起来容易做起:主要的问题是,当我们从模型中缩小并开始投影时,并不是所有模型的UV都会在屏幕空间中看到,因此放大后应该放大透露"洞" (模型的UV太小而无法在屏幕空间中渲染)。

所以我的问题是 - 从远处画画时如何避免这些漏洞?投影映射不是这里的答案,因为它会影响画笔结束的所有面,甚至是可见表面后面的面。超级采样也不会处理极端情况,并且会很慢。

我还怀疑他是否经历了所有模型的纹理像素,以确定它们是否位于画笔下方,因为增加其大小或创建绘画描边会显着减慢速度

1 个答案:

答案 0 :(得分:0)

视频中显示的程序的实现者可能在另外的屏幕外传递中绘制模型,其中纹理ST坐标在屏幕外传递。几年前,有一种方法可以通过使用特殊渲染模式(选择模式)来“挑选”对象 - 不要使用它,它超级慢且效率低。但是选择模式拾取的基本步骤之一是,在投影和模型视图矩阵之上将一个特殊的“拾取”矩阵相乘,这样可以将变换量“缩放”到选择矩形下方。如果将附加转换与ST坐标渲染通道合并到足够高分辨率的缓冲区中(将其称为纹理几何缓冲区)。

现在出现了棘手的部分:请记住,纹理实际上是从ST空间到proj(modelview(XYZW))的映射(因此术语纹理映射)。你真正想要的是逆映射。如果您不关心局部曲率,只需交换传递到“映射”机器的坐标即可。因此,如果你将proj(modelview(XYZW))放到ST将要去的地方,反之亦然,它会给你一个逆映射。使用贴花作为纹理和纹理几何缓冲区来执行此操作,您可以反转纹理贴图并将贴花绘制到模型的纹理空间中。因此,将模型纹理设置为FBO的颜色附件,在其中执行反转绘图,并使用贴花作为纹理进行绘制,然后就可以了。

  

所以我的问题是 - 从远处画画时如何避免这些漏洞?

通过插值。如果您的中间缓冲区足够高分辨率,这将免费发生。请注意,我不是您链接的视频中显示的程序的作者。但我曾经编写这样的程序,虽然我放错了它的来源。这并不难,你通常可以在每个主要的3D建模包中找到这样的功能。如果有适当的工具,那么就没有什么可以使用粗糙的技术来实现这一目标。