光照系统可以工作了。
2008-11-25 16:46
218 查看
光照系统可以工作了,新增加一个Const Buffer专用于传递光照相关的参数:ILightingEnvState.
做光照相对D9来说简单了许多。不需要任何的setShaderParamter之类的调用了。
Simple.Lighting的shade Node 和用于光照的shader lib如下:
libLighting.hlsl:
struct xLightDesc
{
float4 m_Diffuse;
float4 m_Speculer;
float4 m_Position;
float4 m_dir;
};
cbuffer xLightState
{
int4 nLight;
xLightDesc m_Light[8];
}
float4 Phong_Lighting(float3 vNormal , float3 wPosition , float3 eyePosition)
{
float4 vTotal = float4(0.0f,0.0f,0.0f , 0.0f);
for(int i = 0 ; i < nLight.x ; i ++ )
{
xLightDesc _desc = m_Light[i];
float3 LightDirection = _desc.m_Position.xyz - wPosition;
float3 fvLightDirection = normalize( LightDirection );
float3 fvNormal = normalize( vNormal );
float fNDotL = dot( fvNormal, fvLightDirection );
float3 fvReflection = normalize( ( ( 2.0f * fvNormal ) * ( fNDotL ) ) - fvLightDirection );
float3 fvViewDirection = normalize( eyePosition - wPosition);
float fRDotV = max( 0.0f, dot( fvReflection, fvViewDirection ) );
float4 fvTotalAmbient = float4(0.0f,0.0f,0.0f,1.0f);
float4 fvTotalDiffuse = fNDotL * _desc.m_Diffuse;
float4 fvTotalSpecular = float4(_desc.m_Speculer.xyz , 1.0f) * pow( fRDotV, _desc.m_Speculer.w );
vTotal += ( saturate( fvTotalAmbient + fvTotalDiffuse + fvTotalSpecular ) );
}
return vTotal;
}
//Simple.Lighting.hlsl
///{{Slot = Simple_Lighting
Input
{
float4 Color : COLOR0;
float4 wNormal : WNORMAL;
float4 wPosition : WPOSITION;
}
Output
{
float4 color: COLOR0;
}
///}}
///>>Import = libLighting
///{{SourceCode
float4 Simple_Lighting(float4 _Color , float4 wNormal , float4 wPosition)
{
float4 eyePositon = float4(0.0f,0.0f,0.0f,1.0f);
return _Color * Phong_Lighting(wNormal.xyz , wPosition.xyz , eyePositon.xyz );
}
///}}
截个图留念一下。
做光照相对D9来说简单了许多。不需要任何的setShaderParamter之类的调用了。
Simple.Lighting的shade Node 和用于光照的shader lib如下:
libLighting.hlsl:
struct xLightDesc
{
float4 m_Diffuse;
float4 m_Speculer;
float4 m_Position;
float4 m_dir;
};
cbuffer xLightState
{
int4 nLight;
xLightDesc m_Light[8];
}
float4 Phong_Lighting(float3 vNormal , float3 wPosition , float3 eyePosition)
{
float4 vTotal = float4(0.0f,0.0f,0.0f , 0.0f);
for(int i = 0 ; i < nLight.x ; i ++ )
{
xLightDesc _desc = m_Light[i];
float3 LightDirection = _desc.m_Position.xyz - wPosition;
float3 fvLightDirection = normalize( LightDirection );
float3 fvNormal = normalize( vNormal );
float fNDotL = dot( fvNormal, fvLightDirection );
float3 fvReflection = normalize( ( ( 2.0f * fvNormal ) * ( fNDotL ) ) - fvLightDirection );
float3 fvViewDirection = normalize( eyePosition - wPosition);
float fRDotV = max( 0.0f, dot( fvReflection, fvViewDirection ) );
float4 fvTotalAmbient = float4(0.0f,0.0f,0.0f,1.0f);
float4 fvTotalDiffuse = fNDotL * _desc.m_Diffuse;
float4 fvTotalSpecular = float4(_desc.m_Speculer.xyz , 1.0f) * pow( fRDotV, _desc.m_Speculer.w );
vTotal += ( saturate( fvTotalAmbient + fvTotalDiffuse + fvTotalSpecular ) );
}
return vTotal;
}
//Simple.Lighting.hlsl
///{{Slot = Simple_Lighting
Input
{
float4 Color : COLOR0;
float4 wNormal : WNORMAL;
float4 wPosition : WPOSITION;
}
Output
{
float4 color: COLOR0;
}
///}}
///>>Import = libLighting
///{{SourceCode
float4 Simple_Lighting(float4 _Color , float4 wNormal , float4 wPosition)
{
float4 eyePositon = float4(0.0f,0.0f,0.0f,1.0f);
return _Color * Phong_Lighting(wNormal.xyz , wPosition.xyz , eyePositon.xyz );
}
///}}
截个图留念一下。
相关文章推荐
- 工作中需要一种可以带N个系统的自动还原的GHOST
- hadoop编译的本地库会依赖操作系统吗?比如amd64的系统编译的可以在其他X86OS上工作吗??hadoop本地库与系统版本不一致
- 生产返工汇报工作用ERP系统是否可以轻松高效
- 图:智能手机Android系统的评委评分的比赛打分客户端,开发构思中...,可以和管理员电脑协同完成打分展示工作
- HIS-门急诊模块之系统集成工作摘要
- yaffs2文件系统的工作流程和checkpoint机制
- 《代码大全》阅读笔记 第六章 可以工作的类
- OpenGL系统设计-光照与材质(5)
- AIX5.3以后的版本可以动态缩小文件系统的空间
- windows系统打开网页被阻止通过windws防火墙可以轻松解决
- Windows环境下,输入(Chkntfs /X C:)命令可以取消系统每次启动对C盘的磁盘扫描程序
- ASP.NET中,SESSION不需要cookie就可以工作。
- 学生工作管理系统 ----软工实践之结队作业
- 电子表代码,用C语言写的,可以显示系统时间和年月日,而且可以改变时间!
- 因工作需要,安装了个smokeping系统! 推荐
- 个人笔记系统可以使用了-可以粘图片-比wiki好用
- 直播系统的开发准备工作
- 安装了dns且可以正常工作为什么还有"没有可以使用的"DNS服务器"的错误
- 以下代码可以取得系统特征码(网卡MAC、硬盘序列号、CPU ID、BIOS编号)