使用矩阵反转顶点缠绕顺序

Posted

技术标签:

【中文标题】使用矩阵反转顶点缠绕顺序【英文标题】:Reverse vertex winding order using matrices 【发布时间】:2014-06-07 09:31:13 【问题描述】:

我目前正在实现反射(使用渲染到纹理方法),到目前为止它可以工作,唯一的问题是反射版本中的所有对象都是由内向外渲染的。

我想避免更改内部 OpenGL 顶点缠绕顺序,以确保不会过多干扰其他渲染操作。

相反,我想转换我的反射矩阵来进行反转。 (这应该只是另一种反映?)

这是我的反射矩阵(转换相机的视图矩阵):

glm::mat4 matReflection(
    1.f -2.f *n.x *n.x,-2.f *n.x *n.y,-2.f *n.x *n.z,-2.f *n.x *d,
    -2.f *n.x *n.y,1.f -2.f *n.y *n.y,-2.f *n.y *n.z,-2.f *n.y *d,
    -2.f *n.x *n.z,-2.f *n.y *n.z,1.f -2.f *n.z *n.z,-2.f *n.z *d,
    0.f,0.f,0.f,1.f
);

n = 反射平面的法线; d = 平面距离

甚至可以通过矩阵变换来反转顶点顺序吗?如果有,具体是怎样的?

【问题讨论】:

您是否对三角形的反转缠绕顺序有问题,例如因为您启用了背面剔除,或者在着色器中使用了gl_FrontFacing?如果不更改缠绕顺序的状态,这将很难解决。还是与法线的方向有关?这可以通过对法线应用适当的转换来解决。 【参考方案1】:

如果在所有其他转换(包括投影)之后应用矩阵将 y 轴缩放 -1,您最终会得到一个颠倒的图像(您可以通过包含类似 uv.y = 1 的内容来使用它-uv.y 管道中的某处)。

【讨论】:

虽然将 Z 轴缩放 -1.0 会反转手性(假设没有其他轴被翻转),但它实际上不会改变绕组。绕组仅使用窗口空间中的 X 和 Y 确定,Z 无关紧要。另一方面(没有双关语),如果您翻转 X 或 Y,它会同时改变惯用手和缠绕。改变正面方向可能是最简单的事情了。 是的,你说得对,z 轴缩放不起作用。我的第一段也是不正确的(我对反射矩阵“将模型从里到外”的思考有点草率)。我发现 y 轴翻转很有用(如果场景可能混合了剔除/缠绕模式)。

以上是关于使用矩阵反转顶点缠绕顺序的主要内容,如果未能解决你的问题,请参考以下文章

DX11 中的顶点缠绕顺序

获取网格的边界边缘 - 按缠绕顺序

使用topomerge合并topojson会打乱缠绕顺序

OPENGL矩阵顺序与调用顺序相反

OpenGL:深度缓冲向后工作,是不是按缠绕顺序?

04 绘制正方体和位移矩阵