Direct3D中透明渲染的总结
来源:互联网 发布:人工智能技术体系架构 编辑:程序博客网 时间:2024/05/17 03:13
1.渲染的先决条件
打开ALPHA渲染
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
修改材质的Diffuse的Alpha值
D3DMATERIAL9* mat
mat.Diffuse.a=...;
m_pd3dDevice->SetRenderState(D3DRS_LIGHTING,true);
修改VB所指向的TLF顶点格式的Color(自己定义的)
struct TLV
{
float x,y,z;
DWORD color;
float u,v;
}* pVertices;
for( DWORD i=0;i< m_dwVertexCount; i++)
{
(pVertices+i)->dwColor=m_dwColor;
}
m_pVB->Unlock();
m_pd3dDevice->SetRenderState(D3DRS_LIGHTING,false);
从半透明混合的原理知道,首先需要一个基础颜色,然后和另一个颜色进行混合。而在有时将3D物体渲染次序和在3D空间里的位置搞错时,就会发现透明物体后面的物体会消失的情况。这就需要对透明物体进行排序。
排序所基于的原则是:
远的物体先画,近的物体后画。
先画不透明体,再画透明物体。
构造8个视锥平面的顶点
通过PROJECTION矩阵映射到世界矩阵
从顶点构造出视锥体的XY平面(靠摄像机最近的XY平面)
将物体的XYZ代入下式即可得出距离视锥平面的远近了
D3DXPLANE plane;
plane.a*x+plane.b*y+plane.c*z+plane.d
结果为正时表示在摄像机前方,反之在后方
打开ALPHA渲染
m_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
对于通过程序顶点构造的多边形渲染时必须开启ALPHA通道
m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
设置为普通Alpha混合
m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
2.Mesh透明渲染时
修改材质的Diffuse的Alpha值
D3DMATERIAL9* mat
mat.Diffuse.a=...;
开灯渲染
m_pd3dDevice->SetRenderState(D3DRS_LIGHTING,true);
3.顶点多边形透明渲染
修改VB所指向的TLF顶点格式的Color(自己定义的)
struct TLV
{
float x,y,z;
DWORD color;
float u,v;
}* pVertices;
m_pVB->Lock(0, m_dwVertexCount*sizeof(TLV), (void * *) &pVertices, 0);
for( DWORD i=0;i< m_dwVertexCount; i++)
{
(pVertices+i)->dwColor=m_dwColor;
}
m_pVB->Unlock();
顶点多边形透明渲染必须关灯渲染
m_pd3dDevice->SetRenderState(D3DRS_LIGHTING,false);
4.调节渲染次序
从半透明混合的原理知道,首先需要一个基础颜色,然后和另一个颜色进行混合。而在有时将3D物体渲染次序和在3D空间里的位置搞错时,就会发现透明物体后面的物体会消失的情况。这就需要对透明物体进行排序。
排序所基于的原则是:
远的物体先画,近的物体后画。
先画不透明体,再画透明物体。
这里远的物体指的是离摄像机远的物体,这里只简单介绍得到物体远近的方法
构造8个视锥平面的顶点
通过PROJECTION矩阵映射到世界矩阵
从顶点构造出视锥体的XY平面(靠摄像机最近的XY平面)
将物体的XYZ代入下式即可得出距离视锥平面的远近了
D3DXPLANE plane;
plane.a*x+plane.b*y+plane.c*z+plane.d
结果为正时表示在摄像机前方,反之在后方
具体视锥面操作可以参考DXSDK里的Culling例子
- Direct3D中透明渲染的总结
- D3D中透明渲染的总结
- D3D中透明渲染的总结
- Direct3D 11渲染管线总结
- Direct3D中常用的数学计算方法总结
- Direct3D固定渲染流水线分析与总结
- Direct3D固定渲染流水线分析与总结
- 透明物体的渲染
- 透明物体的渲染
- Direct3D渲染到纹理的一点技巧
- Unity中透明材质物体渲染到RenderTexture的问题
- Direct3D渲染到纹理
- Direct3D 半透明渲染
- Direct3D渲染管线简介
- Direct3D渲染管线
- 读书笔记--Direct3D渲染流水线
- Direct3D 11 渲染状态
- Direct3D 世界的Hello:高洛德渲染的三角形(转)
- HPUX 日志
- Direct3D中常用的数学计算方法总结
- C#中调用Windows API的要点
- IE和Firefox(火狐)在JavaScript方面的不兼容及统一方法
- sybase中给表增加和删除字段时内部处理过程分析
- Direct3D中透明渲染的总结
- RTMP协议
- 直接删除表空间,em报错ora-01109:数据库未打开
- GPU技术趋势
- Ubuntu远程桌面控制方法
- WebService大讲堂之Axis2(1):用POJO实现0配置的WebService
- DataValidate.js
- 人生若只如初见
- 我的学术blog..第一篇..!