OpenGL着色器 - Gouraud和Phong着色中的法线?

时间:2013-05-14 10:46:18

标签: opengl glsl shader

我似乎无法理解从顶点到像素的OpenGL管道过程。

有人能告诉我这两个着色技术中顶点法线有多重要吗?据我所知,在gouraud中,在每个顶点计算光照,然后结果颜色在顶点之间的多边形内插(这是在片段操作中完成,在光栅化之前?),而phong着色包括首先插入顶点法线然后计算每个法线上的照度。

另一件事是当应用凹凸贴图时,可以说平面(2个三角形)和砖纹理作为漫反射与其尊重凹凸贴图,所有这些都使用gouraud阴影。 凹凸贴图包括根据凹凸贴图通过渐变来改变法线。但是,如果只有4个法线(4个顶点=平面),并且所有4个相同,那么它会改变什么法线以及何时(在片段着色器处?)。在Gouraud中,您在照明计算后插入每个顶点的颜色,但是在更改法线后进行此计算。

照明如何运作?

3 个答案:

答案 0 :(得分:1)

顶点法线对于Gouraud和Phong着色都是绝对必要的。

在Gouraud阴影中,每个顶点计算光照,然后在三角形中进行插值。

在Phong着色中,法线在三角形内插,然后按像素/片段进行计算。

凹凸贴图是指一系列不同的技术。当进行法线贴图(这些天可能是最常见的变换)时,每个顶点计算法线,双切线(通常错误地称为双法线)和切线以构建基础矩阵。然后在三角形上插入该基矩阵。然后,通过该基础矩阵变换从法线贴图检索的法线,然后每个像素执行照明。

上面的法线贴图技术有一些扩展,允许碰撞隐藏其背后的其他凸起。这通常是通过将高度图与法线贴图一起存储然后通过高度图进行光线行进来查找被遮挡的部分来执行的。这种技术称为Relief Mapping

还有其他较旧的表单,例如DUDV bump mapping(在DirectX 6中实现为环境映射,凹凸贴图或EMBM)。

你还有emboss bump mapping,这是一种非常早期的凹凸贴图方式

编辑 :在回答您的评论时,可以在gouraud阴影三角形上执行浮雕凹凸贴图。其他形式的凹凸映射必然是每个像素(由于它们通过在每个像素(或者至少每个纹理像素)的基础上修改表面法线来工作)。如果有其他方法可以使用每顶点光源执行,我不会感到惊讶,但我想不出任何偏离我的头脑。然而,与基于每个像素的结果相比,结果看起来相当垃圾。

回复:切线和双切线实际上非常简单,一旦你绕过它们(虽然花了我几年,tbh;))。任何3D坐标系都可以由形成orthogonal basis matrix的一组向量来定义。通过设置每个顶点的法线,切线和双切线,您只需在每个顶点设置坐标系。由此您可以将世界或对象空间矢量转换为三角形自己的坐标系。从这里,您可以简单地将光矢量(或位置)转换为三角形表面上给定像素的坐标系。这意味着法线贴图中的法线不需要存储在对象的空间中,因此当这些三角形移动时(例如,当被动画化时),法线已经在它们自己的局部空间中处理。

答案 1 :(得分:0)

法线贴图,模拟凸起曲面的技术之一基本上扰乱了每像素法线之前计算该像素上的光方程。

例如,一种实现方法要求您插入曲面法线和副法线(基于切线空间的 2)并计算第三个每像素(2 + 1个矢量作为切线基础) )。该技术还需要内插光矢量。使用这3个(2 + 1计算)向量(命名为tagent空间基础),您可以将光矢量从对象空间更改为tagent空间。这是因为这3个矢量可以排列为3x3矩阵,可用于改变光方向矢量的基础。

然后,只需使用该tagent-space光矢量并计算每个像素的光方程,其中最基本的形式将是tagent-space光矢量和法线贴图之间的点积(你的凹凸纹理) )。

这是法线贴图的样子(法线组件存储在纹理的每个通道中并且已经在切线空间中):

enter image description here

这是一种方法,你可以在视图空间中计算东西,但上面的内容更容易理解。

旧凹凸贴图更简单,也是一种假效果。

所有凹凸贴图技术都在像素级别运行,因为它们以某种方式扰动表面的呈现方式。即使是旧的浮雕凹凸贴图也会对每个像素进行一些计算。

编辑:我添加了一些说明,当我有一些空闲时间时,我会尝试添加一些数学和示例。虽然有很多资源可以非常详细地解释这一点。

答案 2 :(得分:0)

首先,您不需要了解整个图形管道来编写简单的着色器:)。但是,当然,你应该知道最新情况。您可以在实时渲染中阅读图形管道章节,第3版(möller,hofmann,akenine-moller)。您描述的是每顶点和每片段照明。对于两种计算,顶点法线都是等式的一部分。对于凹凸贴图着色器,您可以更改插值法线。因此,在光栅化之后,您会有片段,其中必须计算缺失的数据以确定最终的像素颜色。