Directx9 shadowvolume 的问题 分不多 全给了!

雷神风暴烈酒 2012-12-19 01:49:18
代码出自directx9 自带的例子 shadow volume
以下的代码段是在shadow volume.fx里面的一段shader,求指教
void VertShadowVolume( float4 vPos : POSITION,
float3 vNormal : NORMAL,
out float4 oPos : POSITION )
{
// Compute view space normal
float3 N = mul( vNormal, (float3x3)g_mWorldView );//vNormal是面法线,在前面将面法线当作顶点法线赋值了
//g_mWorldView = g_mWorldScaling * *g_MCamera.GetWorldMatrix() * *g_Camera.GetViewMatrix()

// Obtain view space position
float4 PosView = mul( vPos, g_mWorldView );

// Light-to-vertex vector in view space
float3 LightVecView = PosView - g_vLightView;//光源到点的向量

// Perform reverse vertex extrusion
// Extrude the vertex away from light if it's facing away from the light.
if( dot( N, -LightVecView ) < 0.0f )//面的法线与点到光源的的夹角大于90,即该面是背光面 需要将其拉伸
{
if( PosView.z > g_vLightView.z )
PosView.xyz += LightVecView * ( g_fFarClip - PosView.z ) / LightVecView.z;
else
PosView = float4( LightVecView, 0.0f );

// Transform the position from view space to homogeneous projection space
oPos = mul( PosView, g_mProj );
} else
oPos = mul( vPos, g_mWorldViewProjection );
}

这个代码段的用途是将 背光面进行拉伸,在下不明白,下面这段的意思 ,请大牛指教

if( dot( N, -LightVecView ) < 0.0f )//面的法线与点到光源的的夹角大于90,即该面是背光面 需要将其拉伸
{
if( PosView.z > g_vLightView.z )
PosView.xyz += LightVecView * ( g_fFarClip - PosView.z ) / LightVecView.z;
else
PosView = float4( LightVecView, 0.0f );

// Transform the position from view space to homogeneous projection space
oPos = mul( PosView, g_mProj );



另外。585行到723行的 填补漏洞的代码 看得不是很懂,只明白了2 == nVertShared时,表示这2条边是物体正面与背面的交界边。

还有一个问题。在535行
                    hr = D3DXCreateMesh( nNextIndex / 3 + nNumMaps * 7,// nNextIndex / 3表示pdwNewIBData中的面数,即经过退化
( pInputMesh->GetNumFaces() + nNumMaps ) * 3,
D3DXMESH_32BIT,
SHADOWVERT::Decl,
pd3dDevice,
&pPatchMesh );

为什么D3DXCreateMesh的第一个参数要加上nNumMaps * 7,为什么要乘以7呢?



最后一个问题
ConvertAdjacencyToPointReps() 经过该函数变换后的邻接信息 究竟是表示什么意思?


问题很多,麻烦大家了。。 百度和google里的相关资料我都看了。。希望大家别复制
...全文
178 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
雷神风暴烈酒 2012-12-21
  • 打赏
  • 举报
回复
我已经弄懂了。。。 帖子就结了
雷神风暴烈酒 2012-12-19
  • 打赏
  • 举报
回复
来人啊。。。。
雷神风暴烈酒 2012-12-19
  • 打赏
  • 举报
回复
求大牛啊。。。。求大牛
雷神风暴烈酒 2012-12-19
  • 打赏
  • 举报
回复
   if( dot( N, -LightVecView ) < 0.0f )//面的法线与点到光源的的夹角大于90,即该面是背光面 需要将其拉伸
     {
         if( PosView.z > g_vLightView.z )
             PosView.xyz += LightVecView * ( g_fFarClip - PosView.z ) / LightVecView.z;
         else
             PosView = float4( LightVecView, 0.0f );
 
        // Transform the position from view space to homogeneous projection space
         oPos = mul( PosView, g_mProj );
为什么要分成 光源在物体前 和光源在物体后 来讨论呢?
科比布莱恩特 2012-12-19
  • 打赏
  • 举报
回复
引用 楼主 Neversaydie_D 的回复:
代码出自directx9 自带的例子 shadow volume 以下的代码段是在shadow volume.fx里面的一段shader,求指教 C/C++ code?12345678910111213141516171819202122232425262728void VertShadowVolume( float4 vPos : POSITION, ……
3D的东西,真心不懂

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧