我目前正在生成几何体,而不是将其作为模型导入。这使得有必要计算应用程序中的所有法线。
我已经成功实现了Gouraud着色(每个顶点光照),现在希望实现Phong着色(每个片段/像素)。
我已经在网上查看了相关的教程,并且有两个阵营:一个提供简单的Gouraud-Phong重新调整着色器代码,虽然提供改进的照明,但并不是真正的每像素。第二种方法通过使用嵌入在纹理中的法线贴图以正确的方式处理,但这些是在建模工具包(如RenderMonkey)中生成的。
我的问题是:
我应该如何以编程方式为我的常规生成法线 生成几何,将其视为顶点集?换句话说,给定一组离散的多边形点,是否需要手动计算插值法线?
- 醇>
我应该在纹理中存储生成的法线,如图所示 在线,如果是这样,我将如何在代码中执行此操作 而不是通过建模软件?
答案 0 :(得分:2)
在内插的每顶点法线上计算片段着色器中的光照肯定会产生更好的结果(假设您正确地重新规范化片段着色器中的插值法线)并且真正 per-像素。虽然差异的强度可能非常依赖于模型镶嵌和照明变化。你刚试过了吗?
只要你在脸部内没有任何改变法线(想想凹凸贴图)并且只插入每顶点法线,法线贴图就完全没必要了,因为你无论如何都要从光栅化器中获得插值法线。如果您确实具有每像素的正常变化(如非常粗糙的表面),法线贴图可以提供更好的效果,而对于每像素照明,正确方式并不是必然的。
如果你计算每个顶点的光照并插入颜色,或者你计算每个片段的光照(即使你只是插入每顶点法线,这就是经典的Phong着色的内容),它会产生巨大的差异,尤其是当你有相当大的三角形或非常光亮的表面(非常高的频率照明变化)。
如上所述,如果你没有高频正常变化(改变三角形内的法线),你就不需要法线贴图,也不会自己插入每顶点法线。您只需像为每个顶点光照所做的那样生成每顶点法线(例如,通过平均相邻面法线)。光栅化器为您进行插值。
在深入研究普通映射等技术之前,您应首先尝试简单的逐像素照明。如果您没有精细镶嵌的几何图形或非常光亮的表面,您肯定会看到简单的每顶点照明的差异。然后,当这个工作时你可以尝试常规的映射技术,但是要使它们工作,你肯定需要先了解每像素光照和Phong着色的含义,而不是Gouraud着色。
答案 1 :(得分:-1)
法线贴图不是每像素照明的要求。
根据定义,唯一的要求是针对每个输出像素/片段评估照明解决方案。您也可以将法线存储在顶点上(也更容易)。
法线贴图可以提供完整的法线数据(rgb贴图),也可以简单地调制存储的顶点法线(du / dv贴图,显示为红色/蓝色)。后一种形式可能更常见,并依赖于顶点法线来起作用。
生成法线取决于您的代码和几何。通常,您使用点积和周围的面或顶点来表示平滑法线,或者只创建一个指向几何体“out”的单位向量。