我似乎不能理解从顶点到像素的OpenGL管道过程。
谁能告诉我顶点法线在这两种着色技术中有多重要?据我所知,在gouraud中,光照是在每个顶点上计算的,然后在顶点之间的多边形上插值结果颜色(这是在碎片操作中完成的吗,在光栅化之前?),phong着色包括首先插值顶点法线,然后计算每个法线上的光照。
另一件事是,当凹凸贴图应用于一个平面(2个三角形)和一个砖纹理,并使用其方面凹凸贴图进行漫反射时,所有这些都使用gouraud着色。凹凸贴图包括根据凹凸贴图通过渐变改变法线。但是它改变了什么法线,什么时候改变(在片段着色器?)如果只有4条法线(4个顶点=平面),并且所有4条法线都相同。在Gouraud中,在照明计算后插值每个顶点的颜色,但此计算是在更改法线之后完成的。
照明是如何工作的?
发布于 2013-05-14 18:59:05
法线贴图,一种模拟凹凸曲面的技术,在之前基本上会扰乱每个像素的法线,然后在该像素上计算光线方程。
例如,一种实现方法需要插值曲面法线和二法线(切线空间基数的2),并计算第三个每像素(切线基数的2+1向量)。此技术还需要插值灯光向量。使用这3个(2+1计算的)向量(命名为tagent空间基础),您可以将灯光向量从对象空间更改为tagent空间。这是因为这3个矢量可以排列为3x3矩阵,可以用来更改灯光方向矢量的基础。
然后,只需使用tagent空间灯光向量并计算每个像素的灯光方程,其中最基本的形式将是tagent空间灯光向量和法线贴图(凹凸纹理)之间的点积。
这是法线贴图的外观(法线组件存储在纹理的每个通道中,并且已经在切线空间中):

这是一种方法,你可以在视图空间中计算东西,但上面的方法更容易理解。
旧的凹凸贴图更简单,也是一种假效果。
所有凹凸贴图技术都在像素级别运行,因为它们以某种方式干扰了曲面的渲染方式。即使是旧的浮雕凹凸贴图也会对每个像素进行一些计算。
编辑:我添加了一些说明,当我有空闲时间时,我会尝试添加一些数学和示例。尽管有很好的资源可以详细解释这一点。
发布于 2013-05-14 22:21:54
顶点法线对于Gouraud和Phong着色都是绝对必要的。
在Gouraud着色中,光照是按顶点计算的,然后跨三角形进行插值。
在Phong着色中,法线是跨三角形插值的,然后按像素/片段进行计算。
凹凸贴图涉及一系列不同的技术。在进行法线贴图时(可能是目前最常见的一种),法线、双切线(经常被错误地称为双法线)和切线是按顶点计算的,以构建一个基本矩阵。然后将这个基矩阵插值到整个三角形上。从法线图中检索到的法线然后通过该基矩阵进行变换,然后按像素执行光照。
上面的法线贴图技术有一些扩展,允许凹凸隐藏在它们后面的其他凹凸。通常,这是通过将高度贴图与法线贴图一起存储,然后光线在高度贴图中行进以查找被遮挡的部分来执行的。这种技术称为Relief Mapping。
还有其他较旧的形式,如DUDV bump mapping (在DirectX 6中实现为环境贴图、凹凸贴图或EMBM)。
还有emboss bump mapping,这是一种非常早期的凹凸贴图方法
编辑:作为对您的评论的回答,浮雕凹凸贴图可以在gouraud着色三角形上执行。其他形式的凹凸贴图必须是逐像素的(由于它们是通过在逐像素(或至少是逐纹理)的基础上修改曲面法线来工作的)。如果有其他方法可以使用逐顶点照明,我不会感到惊讶,但我想不出任何方法。然而,与以像素为单位进行计算相比,结果看起来非常糟糕。
Re:切线和双切线实际上是非常简单的,一旦你理解了它们(尽管我花了几年的时间,tbh;)。任何3D坐标框架都可以由形成orthogonal basis matrix的一组矢量定义。通过设置每个顶点的法线、切线和双切线,您只需在每个顶点上设置坐标框。由此,您可以将世界或对象空间向量转换为三角形自己的坐标框架。从这里,您可以简单地将光向量(或位置)转换为三角形表面上给定像素的坐标框架。这意味着法线贴图中的法线不需要存储在对象的空间中,因此,当这些三角形四处移动时(例如,在设置动画时),法线已经在它们自己的局部空间中进行了处理。
发布于 2013-05-14 19:05:02
首先,您不需要了解整个图形管道来编写一个简单的着色器:)。但是,当然,您应该知道发生了什么。你可以阅读实时渲染中的图形管道章节,第三版(möller,hofmann,akenine-moller)。您所描述的是逐顶点和逐片段照明。对于这两种计算,顶点法线都是方程的一部分。对于凹凸贴图着色器,可以改变插值法线。因此,在光栅化之后,需要计算丢失的数据以确定最终的像素颜色。
https://stackoverflow.com/questions/16541157
复制相似问题