游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4418|回复: 8

投影与反射

[复制链接]

42

主题

140

帖子

203

积分

中级会员

Rank: 3Rank: 3

积分
203
发表于 2003-10-22 15:19:00 | 显示全部楼层 |阅读模式
投影与反射

                             —zh1110
sf_2003102215195.jpg

42

主题

140

帖子

203

积分

中级会员

Rank: 3Rank: 3

积分
203
 楼主| 发表于 2003-10-22 15:21:00 | 显示全部楼层

Re: 投影与反射

          描述:演示了投影与反射特效。


'设置 alpha 的混合状态(地面与反射体颜色混合)...

D3DDevice.SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE
D3DDevice.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
D3DDevice.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
...

1.绘制倒影(反射体)

Dim plReflect As D3DPLANE    '定义反射平面

plReflect.B = 1  '相当于 y=0 的平面(plReflect.A,plReflect.B,plReflect.C)为平面的法线

D3DXMatrixReflect matReflection, plReflect   '反射矩阵
D3DXMatrixMultiply matReflection, matReflection, matView
D3DDevice.SetTransform D3DTS_VIEW, matReflection   '设置视图矩阵
D3DXMatrixTranslation matTemp, 0, 40, 0    '平移矩阵
D3DXMatrixMultiply matWorld2, matWorld, matTemp
D3DDevice.SetTransform D3DTS_WORLD, matWorld2   '设置世界矩阵
D3DDevice.SetRenderState D3DRS_CULLMODE, D3DCULL_NONE  
'绘制
For i = 0 To nMaterials - 1
If bSpecular Then
D3DDevice.SetMaterial SpecularMat
Else
D3DDevice.SetMaterial MeshMaterials(i)
End If
DiamondMesh.DrawSubset i
Next i
D3DDevice.SetTransform D3DTS_VIEW, matView  '还原视图矩阵


'//2. 绘制地面
D3DDevice.SetVertexShader FVF_LVERTEX
D3DDevice.SetRenderState D3DRS_LIGHTING, 0
D3DDevice.SetTexture 0, TexFloor
D3DXMatrixIdentity matTemp
D3DDevice.SetTransform D3DTS_WORLD, matTemp
D3DDevice.SetRenderState D3DRS_ALPHABLENDENABLE, 1   '设置 alpha 的混合状态
D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, vertFloor(0), Len(vertFloor(0))
D3DDevice.SetRenderState D3DRS_ALPHABLENDENABLE, 0
D3DDevice.SetTransform D3DTS_WORLD, matWorld


'//3. 绘制主对象
D3DDevice.SetVertexShader FVF_VERTEX
D3DDevice.SetRenderState D3DRS_LIGHTING, 1
For i = 0 To nMaterials - 1
If bSpecular Then
D3DDevice.SetMaterial SpecularMat
Else
D3DDevice.SetMaterial MeshMaterials(i)
End If
DiamondMesh.DrawSubset i
Next i


'//4. 绘制阴影
v4Light.X = 500 '.577
v4Light.Y = -500 '-.577
v4Light.Z = -500 '-.577
v4Light.w = 0 '1=point light, 0=directional light
Dim plPlane As D3DPLANE  '定义投影平面
D3DXPlaneFromPoints plPlane, MakeVector(0, -20, 0), MakeVector(1, -20, 1), MakeVector(-1, -20, 1)   '设置投影平面
D3DXMatrixShadow matShadow, v4Light, plPlane     '矩阵投影,v4Light为灯光位置
D3DXMatrixMultiply matFinal, matWorld, matShadow
D3DDevice.SetTransform D3DTS_WORLD, matFinal  '设置世界矩阵
'use a black material to get a black shadow...
D3DDevice.SetRenderState D3DRS_ZFUNC, D3DCMP_ALWAYS  '使用黑色的材质得到黑色的投影
D3DDevice.SetMaterial Material
For i = 0 To nMaterials - 1
DiamondMesh.DrawSubset i
Next i
D3DDevice.SetRenderState D3DRS_ZFUNC, D3DCMP_LESSEQUAL  '还原ZFUNC
...

 

可看到,反射的透明效果通过渲染对象两次,一次在下方,另一次是由地面做透明混合。位置变换用改变观察矩阵的方法,这里其实是反转了一下。因为反射的倒影是对称于主对象的,所以还须平移40(地面在Y=-20处)。

 

投影靠变换世界矩阵,变换前先用D3DXMatrixShadow计算投影矩阵,函数第1个参数为结果,第2个参数为灯光位置,第3个参数为投影到的平面。

sf_2003102215211.zip

167.11 KB, 下载次数:

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2003-10-22 15:49:00 | 显示全部楼层

Re:投影与反射

精辟!
冀望不要用大段代码代替说明。
代码有下载就很方便了,说明更详细就好了

1

主题

193

帖子

193

积分

注册会员

Rank: 2

积分
193
QQ
发表于 2009-7-14 20:41:00 | 显示全部楼层

Re:投影与反射

顶一下.........

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
发表于 2009-7-14 21:52:00 | 显示全部楼层

Re:投影与反射

挖坟!

7

主题

87

帖子

109

积分

注册会员

Rank: 2

积分
109
QQ
发表于 2009-7-15 22:14:00 | 显示全部楼层

Re:投影与反射

哇~zh1110?大师级人物来了。。。N年前网易的那个“VB游戏编程站”和你的名字一样,是你开的吧?现在改版了,真让人怀念。

1

主题

193

帖子

193

积分

注册会员

Rank: 2

积分
193
QQ
发表于 2009-7-15 22:17:00 | 显示全部楼层

Re:投影与反射

呵呵。你可能要失望了。。这个贴正是N年前的贴了。。

7

主题

87

帖子

109

积分

注册会员

Rank: 2

积分
109
QQ
发表于 2009-7-15 22:18:00 | 显示全部楼层

Re:投影与反射

我当然知道啊。那里的文章N年前都看过。少有的VB+Shader中文资料,翻译通俗易懂。

1

主题

193

帖子

193

积分

注册会员

Rank: 2

积分
193
QQ
发表于 2009-7-16 18:04:00 | 显示全部楼层

Re:投影与反射

考古。。。刷屏。。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-19 18:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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