贴花实施


11

我在查找有关贴花的信息时遇到了问题,因此也许这个问题会对他人有所帮助。该实现适用于前向渲染器。

有人可以确认我是否可以执行贴花吗?

  • 您可以定义任意尺寸的立方体,以定义公共空间中的投影体积。您检查与定义的立方体的三角形相交以接收投影将影响的三角形。
  • 您修剪这些三角形并保存它们。
  • 然后,您可以使用矩阵技巧来为已保存的三角形计算UV坐标,这些三角形将参考您要投影的纹理。
  • 为此,您可以使用表示公共空间中立方体的高度,宽度和深度的向量,以使fe的左下角为原点。
  • 将其作为i,j,k单位向量放入矩阵中,设置多维数据集的平移,然后对该矩阵求逆。
  • 您可以将保存的三角形的顶点乘以该矩阵,这样就可以将它们的坐标保存在用作UV坐标的0到1大小的立方体内。
  • 这样,您可以将原始三角形投影到其上,并具有UV坐标(UV坐标参考要投影的纹理)。
  • 然后,将保存的三角形重新渲染到场景上,它们将用投影图像覆盖投影区域。

现在,我找不到答案的问题。最后一点对吗?我从未做过软件裁剪,但由于精度有限,似乎容易出错,因为投影纹理会发生一些z争斗。另外,获得UV坐标的方法是否正确?


Answers:


5

看一下这篇文章:

http://blog.wolfire.com/2009/06/how-to-project-decals/

看来他正在使用与您使用的完全相同的方法。他没有谈论z战,但是在更远的距离,这肯定会成为一个问题。

我的建议是,如果Z战变得非常明显,则在一定距离后禁用贴花。


我已经看过这篇文章很多次了,问题是它根本没有谈论我要问的问题,就像您提到的那样,Z战斗并不是真正的距离问题,只是您正在尝试在现有几何图形的上方进行渲染,并且由于精度有限,您能否/不能确定将其置于顶部或完全位于同一位置
dreta 2012年

1
绘制贴图时,您始终可以将深度缓冲区比较功能设置为小于或等于,而不是小于,因此贴图始终仅绘制在它们影响的表面上。
jmegaffin

1

解决Z冲突的方法是在贴图着色器中将顶点的Z值添加到屏幕坐标中后,将其Z值少量增加。

OK .....我使用合适的网状贴花纸。我用在地形上的Y创建了一个网格nxn。我使用代码在地形多边形网格上找到Y。完成所有变换后,我将在屏幕坐标中绘制现有几何图形的顶部。深度缓冲区位于屏幕坐标中,因此通过将贴花多边形的Z向屏幕稍微移动一点,即可停止Z战斗。通过这样做,我将构成贴花网格的多边形数量减少了一半。这是旧的120码

 vec4 v = gl_ModelViewProjectionMatrix * gl_Vertex;
 v.z -= .03;
 gl_Position = v;

希望这能更好地解释它。

全线框。

仅连线地形。


1
这个答案似乎特别简短且没有明确性。你能澄清你的答案吗?
Gnemlock

1
它不难理解..我仅在屏幕空间的Z方向上移动了一点顶点。因为在OpenGL中您总是在屏幕空间中寻找正Z,所以将Z负移一点可解决Z冲突。但是,这有一个问题。.缩小时,z可以使贴图移动得远远超过所需的距离。
Mike O
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.