|
|

楼主 |
发表于 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个参数为投影到的平面。
|
|