📄 mvolumerender.cpp
字号:
pVertices0[s+2].tv0 = 1.0f;
pVertices0[s+2].tw0 = halfTexRangeOff0 + tmp0 * slice;
pVertices0[s+3].x = -halfSliceRange0;
pVertices0[s+3].y = -halfSliceRange0;
pVertices0[s+3].z = -halfSliceRange0 +halfSliceRangeOff0 + tmpZ0 * slice;
pVertices0[s+3].tu0 = 0.0f;
pVertices0[s+3].tv0 = 1.0f;
pVertices0[s+3].tw0 = halfTexRangeOff0 + tmp0 * slice;
}
//----------- for x axies -------------------------------
for(slice=0; slice < OBJECTSLICENUM; slice++)
{
// 1,0 // 0,0 // 1,1 // 0,1
int s = 4* (slice + OBJECTSLICENUM);
pVertices0[s].x = -halfSliceRange0 +halfSliceRangeOff0 + tmpZ0 * slice;
pVertices0[s].y = halfSliceRange0;
pVertices0[s].z = -halfSliceRange0;
pVertices0[s].tu0 = halfTexRangeOff0 + tmp0 * slice;
pVertices0[s].tv0 = 0.0f;
pVertices0[s].tw0 = 0.0f;
pVertices0[s+1].x = -halfSliceRange0 +halfSliceRangeOff0 + tmpZ0 * slice;
pVertices0[s+1].y = halfSliceRange0;
pVertices0[s+1].z = halfSliceRange0;
pVertices0[s+1].tu0 = halfTexRangeOff0 + tmp0 * slice;
pVertices0[s+1].tv0 = 0.0f;
pVertices0[s+1].tw0 = 1.0f;
pVertices0[s+2].x = -halfSliceRange0 +halfSliceRangeOff0 + tmpZ0 * slice;
pVertices0[s+2].y = -halfSliceRange0;
pVertices0[s+2].z = -halfSliceRange0;
pVertices0[s+2].tu0 = halfTexRangeOff0 + tmp0 * slice;
pVertices0[s+2].tv0 = 1.0f;
pVertices0[s+2].tw0 = 0.0f;
pVertices0[s+3].x = -halfSliceRange0 +halfSliceRangeOff0 + tmpZ0 * slice;
pVertices0[s+3].y = -halfSliceRange0;
pVertices0[s+3].z = halfSliceRange0;
pVertices0[s+3].tu0 = halfTexRangeOff0 + tmp0 * slice;
pVertices0[s+3].tv0 = 1.0f;
pVertices0[s+3].tw0 = 1.0f;
}
//----------- for y axies -------------------------------
for(slice=0; slice < OBJECTSLICENUM; slice++)
{
// 1,0 // 0,0 // 1,1 // 0,1
int s = 4* (slice + 2*OBJECTSLICENUM);
pVertices0[s].x = halfSliceRange0;
pVertices0[s].y = -halfSliceRange0 +halfSliceRangeOff0 + tmpZ0 * slice;
pVertices0[s].z = -halfSliceRange0;
pVertices0[s].tu0 = 1.0f;
pVertices0[s].tv0 = 1.0f -halfTexRangeOff0 - tmp0 * slice;
pVertices0[s].tw0 = 0.0f;
pVertices0[s+1].x = -halfSliceRange0;
pVertices0[s+1].y = -halfSliceRange0 +halfSliceRangeOff0 + tmpZ0 * slice;
pVertices0[s+1].z = -halfSliceRange0;
pVertices0[s+1].tu0 = 0.0f;
pVertices0[s+1].tv0 = 1.0f -halfTexRangeOff0 - tmp0 * slice;
pVertices0[s+1].tw0 = 0.0f;
pVertices0[s+2].x = halfSliceRange0;
pVertices0[s+2].y = -halfSliceRange0 +halfSliceRangeOff0 + tmpZ0 * slice;
pVertices0[s+2].z = halfSliceRange0;
pVertices0[s+2].tu0 = 1.0f;
pVertices0[s+2].tv0 = 1.0f -halfTexRangeOff0 - tmp0 * slice;
pVertices0[s+2].tw0 = 1.0f;
pVertices0[s+3].x = -halfSliceRange0;
pVertices0[s+3].y = -halfSliceRange0 +halfSliceRangeOff0 + tmpZ0 * slice;
pVertices0[s+3].z = halfSliceRange0;
pVertices0[s+3].tu0 = 0.0f;
pVertices0[s+3].tv0 = 1.0f -halfTexRangeOff0 - tmp0 * slice;
pVertices0[s+3].tw0 = 1.0f;
}
m_pObjectOrderProxy->Unlock();
// init object face normals(outward).
objFaceNormalZ = D3DXVECTOR3( 0.0f, 0.0f, -1.0f );
objFaceNormalX = D3DXVECTOR3( -1.0f, 0.0f, 0.0f );
objFaceNormalY = D3DXVECTOR3( 0.0f, -1.0f, 0.0f );
// halfSliceRangeOff0 -> 0.270632939
#define HALFSLICER 0.269f//632939f//632939f
objFaceNormal4DZ = D3DXVECTOR4( 0.0f, 0.0f, -HALFSLICER, 0.0f );
objFaceNormal4DX = D3DXVECTOR4( -HALFSLICER, 0.0f, 0.0f, 0.0f );
objFaceNormal4DY = D3DXVECTOR4( 0.0f, -HALFSLICER, 0.0f, 0.0f );
//-------------------- End Proxy Geometry vertex buffer ----------------------
//--------------- Create a vertex buffer for pass1 ------------------------------------
if( FAILED( hr = m_pd3dDevice->CreateVertexBuffer( SLICENUMBER*4*sizeof(VOLUMEVERTEX),
D3DUSAGE_WRITEONLY,
0,
D3DPOOL_DEFAULT, &m_pVB, NULL ) ) )
return hr;
VOLUMEVERTEX* pVertices;
m_pVB->Lock( 0, 0, (void**)&pVertices, 0 );
float tmpZ = SLICEWIDTH / SLICENUMBER;
float tmp = TEXRANGE / SLICENUMBER;
halfSliceRange = SLICEWIDTH / 2.0f;
halfTexRange = TEXRANGE / 2.0f;
// add offset
float halfSliceRangeOff = tmpZ / 2.0f;
float halfTexRangeOff = tmp / 2.0f;
for(slice=0; slice < SLICENUMBER; slice++)
{
// 1,0 // 0,0 // 1,1 // 0,1
int s = 4*slice;
pVertices[s].x = halfSliceRange;
pVertices[s].y = halfSliceRange;
pVertices[s].z = -halfSliceRange +halfSliceRangeOff + tmpZ * slice;
pVertices[s].tu0 = halfTexRange;
pVertices[s].tv0 = -halfTexRange;
pVertices[s].tw0 = -halfTexRange +halfTexRangeOff + tmp * slice;
pVertices[s].tu1 = halfTexRange;
pVertices[s].tv1 = -halfTexRange;
pVertices[s].tw1 = -halfTexRange +halfTexRangeOff + tmp * (slice+1);
pVertices[s+1].x = -halfSliceRange;
pVertices[s+1].y = halfSliceRange;
pVertices[s+1].z = -halfSliceRange +halfSliceRangeOff + tmpZ * slice;
pVertices[s+1].tu0 = -halfTexRange;
pVertices[s+1].tv0 = -halfTexRange;
pVertices[s+1].tw0 = -halfTexRange +halfTexRangeOff + tmp * slice;
pVertices[s+1].tu1 = -halfTexRange;
pVertices[s+1].tv1 = -halfTexRange;
pVertices[s+1].tw1 = -halfTexRange +halfTexRangeOff + tmp * (slice+1);
pVertices[s+2].x = halfSliceRange;
pVertices[s+2].y = -halfSliceRange;
pVertices[s+2].z = -halfSliceRange +halfSliceRangeOff + tmpZ * slice;
pVertices[s+2].tu0 = halfTexRange;
pVertices[s+2].tv0 = halfTexRange;
pVertices[s+2].tw0 = -halfTexRange +halfTexRangeOff + tmp * slice;
pVertices[s+2].tu1 = halfTexRange;
pVertices[s+2].tv1 = halfTexRange;
pVertices[s+2].tw1 = -halfTexRange +halfTexRangeOff + tmp * (slice+1);
pVertices[s+3].x = -halfSliceRange;
pVertices[s+3].y = -halfSliceRange;
pVertices[s+3].z = -halfSliceRange +halfSliceRangeOff + tmpZ * slice;
pVertices[s+3].tu0 = -halfTexRange;
pVertices[s+3].tv0 = halfTexRange;
pVertices[s+3].tw0 = -halfTexRange +halfTexRangeOff + tmp * slice;
pVertices[s+3].tu1 = -halfTexRange;
pVertices[s+3].tv1 = halfTexRange;
pVertices[s+3].tw1 = -halfTexRange +halfTexRangeOff + tmp * (slice+1);
}
m_pVB->Unlock();
//-------------------- End Proxy Geometry vertex buffer ----------------------
//--------------- Create Rendertarget Quad vertex buffer ---------------------
// Initialize final "Big" 2D quad vertex
RENDERTARGETQUAD qVertices[] =
{
{ 0.0f, 0.0f, 0.5f, 1.0f, 0.0f, 0.0f }, // x, y, z, rhw, texture coord u, v.
{ 0.0f, 511.0f, 0.5f, 1.0f, 0.0f, 1.0f },
{ 511.0f, 0.0f, 0.5f, 1.0f, 1.0f, 0.0f },
{ 511.0f, 511.0f, 0.5f, 1.0f, 1.0f, 1.0f }
};
if( FAILED( m_pd3dDevice->CreateVertexBuffer( 4*sizeof(RENDERTARGETQUAD),
D3DUSAGE_WRITEONLY, D3DFVF_RENDERTARGETQUAD,
D3DPOOL_DEFAULT, &m_pFinalQuadVB, NULL ) ) )
{
return E_FAIL;
}
VOID* pQuadVertices;
if( FAILED( m_pFinalQuadVB->Lock( 0, sizeof(qVertices), (void**)&pQuadVertices, 0 ) ) )
return E_FAIL;
memcpy( pQuadVertices, qVertices, sizeof(qVertices) );
m_pFinalQuadVB->Unlock();
//-------------------- End quad vertex buffer --------------------------------
// MPR_TEST
//--------------- Create MPR Rendertarget Quad vertex buffer ---------------------
// MPR 侩 坊歹鸥百 ( MPR texture 谅钎甫 Color 蔼栏肺 啊瘤霸 凳.)
/*
RENDERTARGETQUAD qVertices2[] =
{
{ 513.0f, 0.0f, 0.5f, 1.0f, 0.0f, 0.0f }, // x, y, z, rhw, texture coord u, v.
{ 513.0f, 511.0f, 0.5f, 1.0f, 0.0f, 1.0f },
{ 1024.0f, 0.0f, 0.5f, 1.0f, 1.0f, 0.0f },
{ 1024.0f, 511.0f, 0.5f, 1.0f, 1.0f, 1.0f }
};
*/
RENDERTARGETQUAD qVertices2[] =
{
{ 512.0f, 0.0f, 0.5f, 1.0f, 0.0f, 0.0f }, // x, y, z, rhw, texture coord u, v.
{ 512.0f, 512.50f, 0.5f, 1.0f, 0.0f, 1.0f },
{ 1024.50f, 0.0f, 0.5f, 1.0f, 1.0f, 0.0f },
{ 1024.50f, 512.50f, 0.5f, 1.0f, 1.0f, 1.0f }
};
if( FAILED( m_pd3dDevice->CreateVertexBuffer( 4*sizeof(RENDERTARGETQUAD),
D3DUSAGE_WRITEONLY, D3DFVF_RENDERTARGETQUAD,
D3DPOOL_DEFAULT, &m_pMPRRenderTargetVB, NULL ) ) )
{
return E_FAIL;
}
VOID* pQuadVertices2;
if( FAILED( m_pMPRRenderTargetVB->Lock( 0, sizeof(qVertices2), (void**)&pQuadVertices2, 0 ) ) )
return E_FAIL;
memcpy( pQuadVertices2, qVertices2, sizeof(qVertices2) );
m_pMPRRenderTargetVB->Unlock();
//-------------------- End MPR Rendertarget vertex buffer --------------------------------
// MPR_TEST
//---------------- make large MPR Buffer ----------------------------
if( FAILED( hr = m_pd3dDevice->CreateVertexBuffer( MPRMAXPOINT*2*sizeof(OBJECTORDERPROXY),
D3DUSAGE_WRITEONLY,
0,
D3DPOOL_DEFAULT, &m_pMPRGeometryVB, NULL ) ) )
return hr;
// Lock 秦辑 檬扁拳,,
OBJECTORDERPROXY* pVertices5;
m_pMPRGeometryVB->Lock( 0, 0, (void**)&pVertices5, 0 );
//-----------
for(int k=0; k<MPRMAXPOINT*2; k++) {
pVertices5[k].x = 0;
pVertices5[k].y = 0;
pVertices5[k].z = 0;
pVertices5[k].tu0 = 0.0f;
pVertices5[k].tv0 = 0.0f;
pVertices5[k].tw0 = 0.0f;
}
m_pMPRGeometryVB->Unlock();
// MPR_TEST
//--------------- MPR buffer 旗辑 2D Quad 肺.. ---------------------
if( FAILED( m_pd3dDevice->CreateVertexBuffer( MPRMAXPOINT*2*sizeof(MPR2DQUAD),
D3DUSAGE_WRITEONLY, D3DFVF_MPR2DQUAD,
D3DPOOL_DEFAULT, &m_pMPRQuadVB, NULL ) ) )
{
return E_FAIL;
}
// Lock 秦辑 檬扁拳,,
MPR2DQUAD* pVertices6;
m_pMPRQuadVB->Lock( 0, 0, (void**)&pVertices6, 0 );
//-----------
for(k=0; k<MPRMAXPOINT*2; k++) {
pVertices6[k].x = 0;
pVertices6[k].y = 0;
pVertices6[k].z = 0;
pVertices6[k].rhw = 1.0f;
pVertices6[k].tu0 = 0.0f;
pVertices6[k].tv0 = 0.0f;
pVertices6[k].tw0 = 0.0f;
}
m_pMPRQuadVB->Unlock();
//-------------------- End quad vertex buffer --------------------------------
return S_OK;
}
//////////////////////// make(update) linear Otf texture //////////////////
//----- called in makePreIntegratedTexture() --------------------------------------
HRESULT CAppForm::makeOtf()
{
// Fill the otf texture array
{
int otfValue[4];
for(int i=0; i<4; i++) {
otfValue[i] = int(OTFTEXTUREWIDTH * m_otfParam.den[i] / 255.0);
}
// m_otfAlphaValue = 255 ~ 0
double inclined = double(m_otfAlphaValue) / (otfValue[1] - otfValue[0]);
double declined = double(-m_otfAlphaValue) / (otfValue[3] - otfValue[2]);
for(int d=0; d<otfValue[0]; d++) {
m_linearOtfArray[d] = 0;
}
for( d=otfValue[0]; d<otfValue[1]; d++) {
m_linearOtfArray[d] = DWORD(inclined * (d - otfValue[0]));
}
for( d=otfValue[1]; d<otfValue[2]; d++) {
m_linearOtfArray[d] = m_otfAlphaValue;
}
for( d=otfValue[2]; d<otfValue[3]; d++) {
m_linearOtfArray[d] = DWORD(declined * (d - otfValue[3]));
}
for( d=otfValue[3]; d<OTFTEXTUREWIDTH; d++) {
m_linearOtfArray[d] = 0;
}
}
return TRUE;
}
//////////////////////// make(update) PreIntegration texture //////////////////
//----- called in InitDeviceObjects(), OnHScroll() -------------------------------
HRESULT CAppForm::makePreIntegratedTexture()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -