从顶点数据中获取像素法线

Posted

技术标签:

【中文标题】从顶点数据中获取像素法线【英文标题】:Get pixel normals out of vertex data 【发布时间】:2013-01-04 00:25:46 【问题描述】:

对于照明,我需要片段着色器中的法线向量。我阅读的教程要求我提供法线数据以及模型的顶点。但是顶点指定的面不是已经给出了法线吗?

为了计算法线,我需要三角形的所有三个顶点。但据我所知,我们只能在顶点着色器的每个通道中访问单个顶点。

如何根据顶点数据计算每个像素的法线向量?我想在那之后应用法线贴图,但那是后来的,与这个问题没有真正的关系。

【问题讨论】:

【参考方案1】:

但是顶点指定的面不是已经给出了法线吗?

是的,也不是。从技术上讲,您可以确定每张脸的法线,但通常在建模器中设计 3D 模型的艺术家希望微调法线以调整照明计算。

基于顶点数据的每个像素的法线向量?

只需将法线作为可变变量(varyingout 关键字,取决于 GLSL 版本)传递给片段着色器。法线向量将被重心插值。然后,您可以在片段着色器中将其标准化为单位长度。

【讨论】:

你答案的第一部分很清楚,我想稍后用法线贴图微调法线。但是,如果只给定一个(当前)顶点但不是所有三个三角形角,我如何计算顶点着色器中的法线? @sharethis:您不会在顶点着色器中计算法线。为每个渲染的帧重做此操作将是低效的。您在加载模型时计算一次法线,通常您甚至不会在渲染器中计算它们。通常,3D 模型与法线一起完全保存。 @sharethis:我在***.com/a/6661242/524368中详细解释了如何计算网格的顶点法线 只是对正确答案的补充:您无法在顶点着色器中计算顶点法线,但如果您可以在顶点着色器之前使用几何着色器,则在技术上可以计算顶点法线飞。见this thread。

以上是关于从顶点数据中获取像素法线的主要内容,如果未能解决你的问题,请参考以下文章

[Unity Shader] 逐顶点光照和逐片元光照

如何在 C++ 中获取像素着色器版本和顶点着色器版本

我可以使用顶点着色器来显示模型法线吗?

每个顶点超过 1 个法线

顶点法线的图形问题

在顶点着色器中定位顶点后如何更新法线?