⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mvolumerender.cpp

📁 virtual reality project. This algorithm for building large image to Volume rendering. Using directx
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			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 + -