HLSL实现漫反射光照模型

292 篇文章 14 订阅

漫反射要考虑光源位置和方向,因此这也就是所谓的位置光照模型,反射光线与观察者位置无关他不会因为观察点的变化而变化,所以其常用来模拟不光滑表面。

通常将漫反射和环境光成分相加来综合这些光照,顶点计算公式:

Color(颜色) = A(Intensity) * AColor * Amaterial + DIntensity * D Color* (N dot L) * D material

A=环境 D=漫反射 Intensity = 强度 Amaterial=材质的反射系数,Dmaterial=材质的漫反射系数 N=法向量 L=光向量

 

1.顶点渲染器代码

//--------------------------------------------------------------
// 全局变量
//--------------------------------------------------------------
float4x4 matWorldViewProj;   //复合变换矩阵
float4x4 matWorld;           //世界矩阵
float4   vecLightDir;         //灯光方向
float4   materialAmbient;     //材质反射环境光系数
float4   materialDiffuse;     //材质漫反射系数

//--------------------------------------------------------------
// 输出结构
//--------------------------------------------------------------
struct VS_OUTPUT
{
   float4 Pos: POSITION;
   float4 Color: COLOR;
};


//---------------------------------------------------------------
// 顶点渲染器主函数
//---------------------------------------------------------------
VS_OUTPUT VS( float4 Pos: POSITION, float3 Normal: NORMAL )
{
   //计算顶点位置
   VS_OUTPUT Out = (VS_OUTPUT) 0;
   Out.Pos = mul(Pos, matWorldViewProj);

   //计算顶点颜色
   float4 Light = normalize(vecLightDir);
   float4 Norm   = normalize( mul(Normal, matWorld) );
   float4 diffuseColor = { 1.0f, 1.0f, 1.0f, 1.0f};
   float4 ambientColor = { 0.5f, 0.5f, 0.5f, 1.0f};
   //saturate Clamps x to the range [0, 1]
   Out.Color = ambientColor * materialAmbient + diffuseColor * saturate(dot(Light, Norm)) * materialDiffuse;
  
   return Out;
}

2.编译顶点渲染器

3.创建顶点渲染器

4.设置顶点渲染器全局变量

D3DXMATRIXA16 matWorldViewProj;
matWorldViewProj = matWorld * matView * matProj;
V_RETURN(g_pConstantTable->SetMatrix( pd3dDevice, "matWorldViewProj", &matWorldViewProj ));
V_RETURN(g_pConstantTable->SetMatrix(pd3dDevice, "matWorld", &matWorld ));

5.设置材质ambient和diffuse

//设置材质
D3DMATERIAL9 mtrl;
ZeroMemory(&mtrl,sizeof(D3DMATERIAL9));
mtrl.Ambient.a=1.0f;
mtrl.Ambient.r=1.0f;
mtrl.Ambient.g=1.0f;
mtrl.Ambient.b=0.0f;

V_RETURN(g_pConstantTable->SetVector(pd3dDevice,"materialAmbient",&D3DXVECTOR4(mtrl.Ambient.r,mtrl.Ambient.g,
   mtrl.Ambient.b,mtrl.Ambient.a)));
mtrl.Diffuse.r=1.0f;
mtrl.Diffuse.g=1.0f;
mtrl.Diffuse.b=0.0f;
mtrl.Diffuse.a=1.0f;
V_RETURN(g_pConstantTable->SetVector(pd3dDevice,"materialDiffuse",&D3DXVECTOR4(mtrl.Diffuse.r,mtrl.Diffuse.g,
   mtrl.Diffuse.b,mtrl.Diffuse.a)));

6.设置光的方向

//设置光的方向
D3DXVECTOR4 LightDirect;
LightDirect=D3DXVECTOR4(cosf(timeGetTime()/350.0f),1.0f,sinf(timeGetTime()/350.0f),1.0f);
g_pConstantTable->SetVector(pd3dDevice,"vecLightDir",&LightDirect);

结合顶点渲染器代码部分

//计算顶点颜色
   float4 Light = normalize(vecLightDir);
   float4 Norm   = normalize( mul(Normal, matWorld) );/
   float4 diffuseColor = { 1.0f, 1.0f, 1.0f, 1.0f};
   float4 ambientColor = { 0.5f, 0.5f, 0.5f, 1.0f};
   //saturate Clamps x to the range [0, 1]
   Out.Color = ambientColor * materialAmbient + diffuseColor * saturate(dot(Light, Norm)) * materialDiffuse;

两处///即为计算光照叠加效果颜色的关键部分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
光照模型是用于模拟真实光照效果的技术,它在计算机图形学中起着重要的作用。在Visual Studio中,我们可以利用现有的图形库或编写自定义的着色器来实现光照模型光照模型主要由三个组成部分构成:环境光、漫反射光和镜面光。环境光是指光源光线无法直接照射到物体表面但又被周围环境反射到物体上的光线。漫反射光是指光线与物体表面发生散射的现象,它的强度与入射角度和物体表面法线的夹角成正比。镜面光是指光线以方向性较强的方式反射出去,它的强度与入射角度和观察角度的夹角成正比。 在Visual Studio中,我们可以使用着色器编程语言(如HLSL或GLSL)来实现光照模型。通过在顶点或像素着色器中计算光照强度并将其应用于物体表面,我们可以实现逼真的光照效果。此外,我们还可以使用光源属性(如光源颜色、位置和强度)来调整光照模型的效果。 使用光照模型可以使我们的渲染场景更加真实、有层次感,并增加物体的体积感。它可以提高图形渲染的逼真度,使得场景中的物体看起来更具立体感和真实感。 总之,光照模型是Visual Studio中用于模拟真实光照效果的重要技术。通过在着色器中计算光照强度并应用于物体表面,我们可以实现更加真实的渲染效果,使得场景中的物体呈现出立体感和真实感。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值