博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
per pixel lighting 和 per vertex lighting
阅读量:5107 次
发布时间:2019-06-13

本文共 1629 字,大约阅读时间需要 5 分钟。

      以前没有用过FX Composer,今天用这个写了一下per pixel lighting 和 per vertex lighting,主要参考了http://dev.gameres.com/Program/Visual/3D/PPL.htm和《3D绘图程序设计》。

      per vertex lighting顾名思义主要是对三角形或者四边形的顶点进行光照计算,然后内插得到其他顶点的光照,当三角形面很大时,效果不是很好,而且容易出现马赫带想象,vs和ps代码如下:

 
struct
VS_INPUT
{
float4 Position : POSITION;
float3 Normal : Normal;
};
struct
VS_OUTPUT
{
float4 Position : POSITION;
float4 Color : COLOR;
};
VS_OUTPUT mainVS(VS_INPUT In){
VS_OUTPUT Out;
Out.Position
=
mul(float4(In.Position.xyz,
1.0
), WorldViewProj);
float3 vWorldNormal
=
mul(In.Normal,(float3x3) WorldXf);
float3 vWorldPosition
=
mul(In.Position,WorldXf).xyz;
float3 vDir
=
normalize(Light0Pos
-
vWorldPosition);
Out.Color.rgb
=
Light0Color
*
saturate(dot(vDir,vWorldNormal));
Out.Color.a
=
1.0f
;
return
Out;
}
float4 mainPS(VS_OUTPUT In) : COLOR {
return
In.Color;
}

  而per pixel lighting由于把光照以后,相当于对每个像素进行光照计算,而插值的部分主要是法线向量,所以计算量比较大,但是效果要细致。shader代码如下:

 
struct
VS_INPUT
{
float4 Position : POSITION;
float3 Normal : Normal;
};
struct
VS_OUTPUT
{
float4 Position : POSITION;
float3 WorldNormal : TEXCOORD0;
float3 WorldPosition : TEXCOORD1;
};
VS_OUTPUT mainVS(VS_INPUT In){
VS_OUTPUT Out;
Out.Position
=
mul(float4(In.Position.xyz,
1.0
), WorldViewProj);
Out.WorldNormal
=
mul(In.Normal,(float3x3) WorldXf);
Out.WorldPosition
=
mul(In.Position,WorldXf).xyz;
return
Out;
}
float4 mainPS(VS_OUTPUT In) : COLOR {
float4 color;
float3 vDir
=
normalize(Light0Pos
-
In.WorldPosition);
color.rgb
=
Light0Color
*
saturate(dot(vDir,In.WorldNormal));
color.a
=
1.0f
;
return
color;
}

两者效果对比如下(左边为per vertex,右边为per pixel):

2011022014581957.png   2011022014583025.png.

转载于:https://www.cnblogs.com/bite_the_bullet/archive/2011/02/20/1959050.html

你可能感兴趣的文章
2018.2.1号 第一次在公司闹事
查看>>
Anaconda使用教程
查看>>
LeetCode题库13. 罗马数字转整数(c++实现)
查看>>
1010 一元多项式求导 (25 分)
查看>>
【NOIP2010】关押罪犯
查看>>
PIC2, Rank-Order Plots, Lift Charts and Pareto chart
查看>>
spring-4设计模式-代理动态,代理源码分析,实现自己的动态代理
查看>>
EXCEL中对1个单元格中多个数字求和
查看>>
webpack 使用exports-loader时的报错信息及解决方式
查看>>
@Controller和@RestController的区别?
查看>>
Spring MVC3.2 通过Servlet3.0实现文件上传
查看>>
volatile学习
查看>>
内部类
查看>>
技能是重要的
查看>>
团队冲刺阶段二(四)
查看>>
Razr Maxx CM10刷机指南
查看>>
成员变量赋值问题【向前引用】
查看>>
Emmet(zen coding)文档(一)[译文]
查看>>
圆形波导
查看>>
解析Object.defineProperty的作用
查看>>