计算片段着色器内平面的法线

Posted

技术标签:

【中文标题】计算片段着色器内平面的法线【英文标题】:Calculate normals for plane inside fragment shader 【发布时间】:2013-07-04 09:06:15 【问题描述】:

我有一种情况需要做光影。我没有顶点着色器,因此无法将法线插入片段着色器。我也无法通过法线贴图。我可以在片段着色器中完全基于片段坐标生成法线吗?在我的例子中,几何图形总是平面的。

并扩展我正在尝试做的事情:

我正在使用NV_path_rendering 扩展,它允许rendering pure vector graphics on GPU。问题是只有片段阶段可以通过着色器访问,这基本上意味着 - 我不能将顶点着色器与 NV_Path 对象一起使用。

【问题讨论】:

“我没有顶点着色器” 嗯?怎么样,你使用的是OpenGL-2吗?通常,您必须至少提供一个 VS 和一个 FS 才能使事情正常进行。仅 FS 仅适用于固定 VS 功能。 不,我使用的是 NV_PATH 文本,它只允许通过片段阶段进行着色器访问。 那你能不能只写顶点着色器? 不,NV_PATH 明确指出只能使用片段着色器,因为它使用完全不同的管道进行原始转换... @MichaelIV:我建议您将这些信息放入原始问题中。 【参考方案1】:

由于您的形状是扁平的并且 NV_PATH 需要兼容配置文件,您可以正常通过内置变量 gl_Color 或 gl_SecondaryColor

扩展描述说有某种插值:

每个顶点数据的插值(第 3.6.1 节)。路径图元既没有传统的顶点,也没有每个顶点的数据。相反,片段生成插值的每片段颜色、纹理坐标集和雾坐标,作为对象空间或眼睛空间路径坐标的线性函数,或者直接使用当前颜色、纹理坐标集或雾坐标状态。

http://developer.download.nvidia.com/assets/gamedev/files/GL_NV_path_rendering.txt

【讨论】:

但是再想一想我不确定它是否会起作用,因为颜色不会插值。没有顶点... @MichaelIV 你想达到什么目的?从您所写的内容中,我了解到您的几何图形是平坦的,这意味着您每条曲线都会有一个法线,这似乎不是真的。 这就是重点,没有“几何”。它是路径。它们的光栅化方式与基于顶点的几何不同。如果您阅读有关 NV_PATH 的信息,您就会明白我的意思。 @MichaelIV 那么“几何在我的情况下总是平面的”是什么意思? 是的,你是对的,我的错......“几何”是矢量形状(可以是文本或任何其他形状)但它是平面几何。【参考方案2】:

这是一种“将法线设置为面法线”的方法,而对顶点法线一无所知(据我所知)。

https://***.com/a/17532576/738675

我有一个three.js 演示在这里工作:

http://meetar.github.io/three.js-normal-map-0/index6.html

我的实现是从顶点着色器获取顶点位置数据,但听起来你可以通过其他方式获得。

【讨论】:

以上是关于计算片段着色器内平面的法线的主要内容,如果未能解决你的问题,请参考以下文章

在片段着色器中使用 textureCube 访问环境贴图失败

如何使用在质心处计算的光来实现平面着色?

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

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

在顶点着色器中将法线转换为视图空间

在 GLSL 中让相机正常