HLSL实现光照(计算顶点颜色)疑惑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HLSL实现光照(计算顶点颜色)疑惑相关的知识,希望对你有一定的参考价值。

DIrectX9.0 编程基础 (龙书)里面的顶点着色器光照例程是不是有毛病
vs Diffuse Lighting

LightDirection.w = 0.0f;
input.normal.w = 0.0f;
LightDirection = mul(LightDirection, ViewMatrix);
input.normal = mul(input.normal, ViewMatrix);

// Compute cosine of the angle between light and normal.
float s = dot(LightDirection, input.normal);
if( s < 0.0f )
s = 0.0f;
// Ambient light reflected is computed by performing a
// component wise multiplication with the ambient material
// vector and the ambient light intensity vector.
// Diffuse light reflected is computed by performing a
// component wise multiplication with the diffuse material
// vector and the diffuse light intensity vector. Further
// we scale each component by the shading scalar s, which
// shades the color based on how much light the vertex received
// from the light source.
//
// The sum of both the ambient and diffuse components gives
// us our final vertex color.
//
output.diffuse = (s * (DiffuseLightIntensity * DiffuseMtrl)) +(AmbientMtrl * AmbientLightIntensity);
好像他的漫反射计算结果不对,如果去掉环境光部分(AmbientMtrl * AmbientLightIntensity)
物体渲染出来就是黑的,没颜色
是不是法线 和 光方向变换方法有错误
望有大虾讲一下这里面的 变换问题(如何变换光方向和法线到同一个参考系里)
可以QQ指教928578747,谢谢

参考技术A 可能是你打错了……我做的时候问题不大

关于变换的问题……

先把法向量乘上观察矩阵
lightdirection.w=0.0f;
input.m_normal.w=0.0f;
input.m_normal=mul(input.m_normal,g_viewmatrix);

单位化
lightdirection=normalize(lightdirection);
input.m_normal=normalize(input.m_normal);

求出他们点积
output.m_texcroodgray.x=dot(g_lightdirection,input.m_normal);

逐顶点光照 逐像素光照 差异对比

逐顶点光照(Gouraud着色法)

先计算,再插值,控制精度为triangle;
在vertex阶段分别计算每个顶点的颜色值,在pixel阶段再通过双线性插值计算三角形区域中其它像素的颜色。
优点:
1.当处理高精度多边形模型时,由于每个多边形所覆盖的区域很小,因此插值之后每个像素的误差也很小,所以逐顶点光照可以工作的很好;

2.如果三角形所覆盖的像素数量大于顶点数量,其效率相对于pixel较高;

缺点:
1.若顶点过多,效率慢;

2.处理某些跨度较大的多边形(比如:低精度模型,弧度较大的模型),由于跨度较大,插值后差异较大,影响最终效果;

3.渲染一些与位置相关的光照效果(比如高光)时,得到的效果就会有问题。如果在多边形的中心有高光,而且这个高光没有扩散到该多边形的任何顶点,使用Gouraud着色法就不会渲染出任何效果;而如果正好是多边形的顶点上有高光,那么这个点上的高光是正确的,但插值会导致高光以很不自然的形式扩散到相邻的多边形上。

逐像素光照(Phong着色法)
先插值,再计算,控制精度为pixel;
从多边形顶点的法线到多边形表面进行差值;
优点:
1.在对于有较小的高光曲线区的反射模型,例如PHONG模型时,Phong着色法比Gouraud着色法更优。但运算程序也比前者为复杂。

以上是关于HLSL实现光照(计算顶点颜色)疑惑的主要内容,如果未能解决你的问题,请参考以下文章

逐顶点光照 逐像素光照 差异对比

逐顶点光照 逐像素光照 差异对比

OpenGL:使用着色器通过使用预先计算的颜色图来创建顶点照明?

Vertex中实现每顶点光照的镜面高光效果

Unity中HLSL代码块的基本知识归纳整理

游戏编程精粹学习 - 使用定点颜色插值模拟实时光照