【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 4066|回复: 0

[DirectX] 電腦繪圖(三)-基本Lighting-2

[复制链接]
发表于 2006-3-20 19:20:09 | 显示全部楼层 |阅读模式

這次要接著講上次的Lighting

上次寫到Gouraud shading,再來就是比gouraud效果好一點點的phong shading

Phong是Gouraud的學生 在Gouraud提出他的shading後

Phong就認為 如果我先求出三角形裡面所有pixel的法向量 再去lighting算出他的顏色 不是會比較好嗎(Gouraud是先拿頂點的法向量去lighting算出頂點的顏色 再給硬體去填裡面的顏色) Phong是自己算裡面每一個pixel的顏色 這樣效果的確是好很多 不過就是需要有GPU來做 pixel shader 這是Phong的示意圖

因為公式跟Gouraud一樣 所以直接貼個程式好了 還蠻簡單的 只是本來是算頂點 現在變成算像素 計算量差蠻多的

VS_OUTPUT PhongVS(float4 inPos : POSITION, float3 inNorm : NORMAL)
{
float4 a;
VS_OUTPUT out1 = (VS_OUTPUT) 0;

a = mul(inPos, mWorld);
out1.pos = mul(inPos, mWVP);
out1.norm = mul(inNorm, (float3×3) mWorld);
out1.lgt = mainLightPosition - a.xyz;
out1.cam = camPosition.xyz - a.xyz;

return out1;
}

void PhongPS(in float3 vNorm : TEXCOORD0,
in float3 vLgt : TEXCOORD1,
in float3 vCam : TEXCOORD2,
out float4 oCol : COLOR0)
{
float3 normDir = normalize(vNorm);
float3 lgtDir = normalize(vLgt);
float3 halfDir = normalize(lgtDir + normalize(vCam));

float diff = saturate(dot(normDir, lgtDir));
float spec = pow(saturate(dot(normDir, halfDir)), power);

// phong shading model
oCol.rgb = ambLgt*amb + diff*mainLightColor*dif + spec*mainLightColor*spe;
oCol.a = dif.a;
}

上面vextex shader是在做座標系統的轉換 下面piexel shader就是在計算顏色了

下面放兩張圖 比較一下 Gouraud 跟 Phong

第一張是Gouraud without specular

第二張是 Phong

下回來揭曉bump mapping的秘密 雖然上面寫的不清不楚 不過也算一種紀錄

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-5-14 04:23

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表