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

📄 shader_brdf.cpp

📁 游戏编程精华02-含有几十个游戏编程例子
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	{
		m_pD3DDev->SetTextureStageState(0, SavedTextureStage0[i].Type, SavedTextureStage0[i].Value);
	}
	for (i = 0; i < sizeof(SavedTextureStage1) / sizeof(tTextureStates); i++)
	{
		m_pD3DDev->SetTextureStageState(1, SavedTextureStage1[i].Type, SavedTextureStage1[i].Value);
	}

	return S_OK;
}

HRESULT CShaderBRDF::Create2DBitmap(DWORD x, DWORD y, DWORD width, DWORD height)
{
    TLVertex* v;
	HRESULT hr;

		// Create a big square for rendering the Logo mask
    hr = m_pD3DDev->CreateVertexBuffer( 4*sizeof(TLVertex),
                                                 D3DUSAGE_WRITEONLY, D3DFVF_TLVERTEX, 
                                                  D3DPOOL_MANAGED, &m_pTexture2DVB );
	if (FAILED(hr))
	{
		MessageBox(NULL, "Failed to create logo vertex buffer!", "ERROR", MB_OK);
		return hr;
	}

	hr = m_pTexture2DVB->Lock( 0, 0, (BYTE**)&v, 0 );
	if (SUCCEEDED(hr))
	{
		v[0].Position = D3DXVECTOR4(x, y, 0, 1);
		v[0].Diffuse = 0xffffffff;
		v[0].Specular = 0;
		v[0].Texture = D3DXVECTOR2(0, 0);

		v[1].Position = D3DXVECTOR4(x, y+height, 0, 1);
		v[1].Diffuse = 0xffffffff;
		v[1].Specular = 0;
		v[1].Texture = D3DXVECTOR2(0, 1);
    
		v[2].Position = D3DXVECTOR4(x+width, y, 0, 1);
		v[2].Diffuse = 0xffffffff;
		v[2].Specular = 0;
		v[2].Texture = D3DXVECTOR2(1, 0);

		v[3].Position = D3DXVECTOR4(x+width, y+width, 0, 1);
		v[3].Diffuse = 0xffffffff;
		v[3].Specular = 0;
		v[3].Texture = D3DXVECTOR2(1, 1);

		m_pTexture2DVB->Unlock();
	}

	return hr;

}

HRESULT CShaderBRDF::CreateTestQuad()
{
    TSVertex* v;
	HRESULT hr;
	float x,y,width,height;

	width = height = m_ObjectRadius[WOMAN_OBJECT]/2;
	x = m_ObjectCenter[WOMAN_OBJECT].x;
	y = m_ObjectCenter[WOMAN_OBJECT].y;


		// Create a big square for rendering the Logo mask
    hr = m_pD3DDev->CreateVertexBuffer( 4*sizeof(TSVertex),
                                                 D3DUSAGE_WRITEONLY, TSVERTEX_FVF, 
                                                  D3DPOOL_MANAGED, &m_pTestQuadVB );
	if (FAILED(hr))
	{
		MessageBox(NULL, "Failed to create Test Quad vertex buffer!", "ERROR", MB_OK);
		return hr;
	}

	hr = m_pTestQuadVB->Lock( 0, 0, (BYTE**)&v, 0 );
	if (SUCCEEDED(hr))
	{
		v[0].Position = D3DXVECTOR3(x, y, m_ObjectCenter[WOMAN_OBJECT].z);
		v[0].Normal = D3DXVECTOR3(0, 0, -1);
		v[0].Texture0 = D3DXVECTOR2(0, 0);

		v[1].Position = D3DXVECTOR3(x+width, y, m_ObjectCenter[WOMAN_OBJECT].z);
		v[1].Normal = D3DXVECTOR3(0, 0, -1);
		v[1].Texture0 = D3DXVECTOR2(1, 0);
    
		v[2].Position = D3DXVECTOR3(x, y-height, m_ObjectCenter[WOMAN_OBJECT].z);
		v[2].Normal = D3DXVECTOR3(0, 0, -1);
		v[2].Texture0 = D3DXVECTOR2(0, 1);

		v[3].Position = D3DXVECTOR3(x+width, y-height, m_ObjectCenter[WOMAN_OBJECT].z);
		v[3].Normal = D3DXVECTOR3(0, 0, -1);
		v[3].Texture0 = D3DXVECTOR2(1, 1);

		m_pTestQuadVB->Unlock();
	}

	return hr;

}

HRESULT CShaderBRDF::SetTextureStageStates(DWORD materialNum, DWORD index)
{
	D3DXMATERIAL *tMaterials;

	tMaterials = (D3DXMATERIAL *)m_pMaterials[index]->GetBufferPointer();
    // Setup render states
	if (tMaterials[materialNum].pTextureFilename != NULL)
	{
		// setup to use textures
		m_pD3DDev->SetTexture(0, m_pWomanTexture);

	    m_pD3DDev->SetRenderState(D3DRS_LIGHTING,	     FALSE );
		m_pD3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);

		m_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
		m_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
		m_pD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
		m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
		m_pD3DDev->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);

		m_pD3DDev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
		m_pD3DDev->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
		m_pD3DDev->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1);
	}
	else
	{
		// setup to use textures
		m_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
		m_pD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
		m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);

		m_pD3DDev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
		m_pD3DDev->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
		m_pD3DDev->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1);
	}
	
	return S_OK;
}
// ------------------------------------------------------------------------------
// CShaderBRDF::Tick
//
// Description: This function is called every frame.  Here is where we write
//		and update constants, clear the z- and back-buffer and render our 
//		primitives
// ------------------------------------------------------------------------------ 
HRESULT CShaderBRDF::Tick(EBTimer* pTimer)
{
	D3DXMATERIAL *tMaterials;
	HRESULT hr = S_OK;
	DWORD i;

	m_pD3DDev->SetRenderState(D3DRS_FILLMODE, (m_bWireframe ? D3DFILL_WIREFRAME : D3DFILL_SOLID));

	m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00BFBFBF, 1.0f, 0L);

	m_pD3DDev->SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);

	SetVertexShaderMatrices(LIGHT_OBJECT);
	// draw the spotlight
	m_pD3DDev->SetVertexShader(m_dwCurrentVShader[LIGHT_OBJECT]);
	m_pD3DDev->SetPixelShader(m_dwCurrentPShader[LIGHT_OBJECT]);

	// use this vertex buffer as our source for vertices
	hr = m_pD3DDev->SetStreamSource(0, m_pVertexBuffer[LIGHT_OBJECT], sizeof(TSVertex));
	if (FAILED(hr))
		return hr;	
	//set index buffer
	m_pD3DDev->SetIndices(m_pIndexBuffer[LIGHT_OBJECT], 0);

	for(i = 0; i < m_dwNumSections[LIGHT_OBJECT]; i++)
	{
		SetTextureStageStates(i, LIGHT_OBJECT);
		tMaterials = (D3DXMATERIAL *)m_pMaterials[LIGHT_OBJECT]->GetBufferPointer();
		m_pD3DDev->SetVertexShaderConstant(CV_MATERIAL_COLOR, &tMaterials[i].MatD3D.Diffuse, 1);

		m_pD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, m_pAttributes[LIGHT_OBJECT][i].VertexStart,
			m_pAttributes[LIGHT_OBJECT][i].VertexCount, m_pAttributes[LIGHT_OBJECT][i].FaceStart*3, 
			m_pAttributes[LIGHT_OBJECT][i].FaceCount);
	}

	m_pD3DDev->SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
	m_pD3DDev->SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
	m_pD3DDev->SetTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
	m_pD3DDev->SetTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
	m_pD3DDev->SetTextureStageState(2, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
	m_pD3DDev->SetTextureStageState(2, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
	m_pD3DDev->SetTextureStageState(3, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
	m_pD3DDev->SetTextureStageState(3, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);

	// Now for the dress, Minnaert light it in second pass
	// setup to use textures, normalizing, Minnaert reflections texture
	m_pD3DDev->SetTexture(0, m_pNormalizingTexture);
	m_pD3DDev->SetTexture(1, m_pNormalizingTexture);
	m_pD3DDev->SetTexture(2, m_pMinnaertTexture);
	m_pD3DDev->SetTexture(3, m_pNormalizingTexture);
//	m_pD3DDev->SetTexture(3, m_pVelvetBumpMapTexture);

	// since Microsoft doesn't keep the hierarchy names around just use a hardcoded
	// number
	tMaterials = (D3DXMATERIAL *)m_pMaterials[WOMAN_OBJECT]->GetBufferPointer();
	m_pD3DDev->SetVertexShaderConstant(CV_MATERIAL_COLOR, &tMaterials[DRESS_INDEX].MatD3D.Diffuse, 1);

	SetVertexShaderMatrices(WOMAN_OBJECT);
	if (m_eDisplayOption == BRDFDISPLAY_SHADING)
	{
		// first pass just use fixed function pipeline
		m_pD3DDev->SetVertexShader(m_dwCurrentVShader[LIGHT_OBJECT]);
		m_pD3DDev->SetPixelShader(m_dwCurrentPShader[LIGHT_OBJECT]);
		SetTextureStageStates(i, WOMAN_OBJECT);
		m_pD3DDev->SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
		m_pD3DDev->SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
	}
	else
	{
		// we are using BRDF mode here, so setup dress to use it
		m_pD3DDev->SetVertexShader(m_dwCurrentVShader[WOMAN_OBJECT]);
		m_pD3DDev->SetPixelShader(m_dwCurrentPShader[WOMAN_OBJECT]);
	}

#ifdef TESTQUAD
	m_pD3DDev->SetStreamSource(0, m_pTestQuadVB, sizeof(TSVertex));
	m_pD3DDev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2 );
#else
	// use this vertex buffer as our source for vertices
	hr = m_pD3DDev->SetStreamSource(0, m_pVertexBuffer[WOMAN_OBJECT], sizeof(TSVertex));
	if (FAILED(hr))
		return hr;	
	//set index buffer
	m_pD3DDev->SetIndices(m_pIndexBuffer[WOMAN_OBJECT], 0);
	m_pD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, m_pAttributes[WOMAN_OBJECT][DRESS_INDEX].VertexStart,
					m_pAttributes[WOMAN_OBJECT][DRESS_INDEX].VertexCount, 
					m_pAttributes[WOMAN_OBJECT][DRESS_INDEX].FaceStart*3,
					m_pAttributes[WOMAN_OBJECT][DRESS_INDEX].FaceCount);


	m_pD3DDev->SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
	m_pD3DDev->SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);

	// the light object uses normal lighting without minnaert
	m_pD3DDev->SetVertexShader(m_dwCurrentVShader[LIGHT_OBJECT]);
	m_pD3DDev->SetPixelShader(m_dwCurrentPShader[LIGHT_OBJECT]);

	for(i = 0; i < m_dwNumSections[WOMAN_OBJECT]; i++)
	{
		if (i != DRESS_INDEX)
		{
			SetTextureStageStates(i, WOMAN_OBJECT);
			tMaterials = (D3DXMATERIAL *)m_pMaterials[WOMAN_OBJECT]->GetBufferPointer();
			m_pD3DDev->SetVertexShaderConstant(CV_MATERIAL_COLOR, &tMaterials[i].MatD3D.Diffuse, 1);

			m_pD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, m_pAttributes[WOMAN_OBJECT][i].VertexStart,
				m_pAttributes[WOMAN_OBJECT][i].VertexCount, m_pAttributes[WOMAN_OBJECT][i].FaceStart*3,
				m_pAttributes[WOMAN_OBJECT][i].FaceCount);
		}
	}

#endif

#ifdef TESTQUAD
	m_pD3DDev->SetTexture(0, m_pVelvetBumpMapTexture);
	Draw2DBitmap();
#endif

	return hr;
}


void CShaderBRDF::MouseButton(HWND hWnd, eButtonID button, bool bDown, int x, int y)
{
	if (button == MOUSE_LEFTBUTTON)
	{
		m_SaveMouse_bDown[m_Rotating] = bDown;
		if(bDown)
		{
			m_mUI->OnLButtonDown(x, y);
		}
		else
		{
			m_mUI->OnLButtonUp(x, y);
		}
	}
	return;
}

void CShaderBRDF::MouseMove(HWND hWnd, int x, int y)
{

	// this is a real hack, but the trackball code
	// won't let you set the matrix, so I have to save all the mouse
	// crap.
	if (m_Rotating != m_LastRotating)
	{
		m_LastRotating = m_Rotating;
		m_mUI->Reset();
		m_curYaw = 0.0f;
		m_curPitch = 0.0f;
		m_VRotation.z = 1.0f;
	}

	m_mUI->OnMouseMove(x, y);
	if (m_SaveMouse_bDown[m_Rotating])
	{
		m_SaveMouse_X[m_Rotating] += x;
		m_SaveMouse_Y[m_Rotating] += y;
	}
	return;
}

void CShaderBRDF::Keyboard(DWORD dwKey, UINT nFlags, bool bDown)
{
    if ( bDown )
    {
        switch ( dwKey )
        {

            case 'H' :
            case VK_F1 :
            {
		        ::MessageBoxEx( NULL, " Help : F1 - Help \n\n Home - Reset To Defaults \n\n W - Wireframe Toggle \n\n Space\\Pause - Toggle Pause/Resume \n\n Left Button & Mouse - Rotate Object\n\n Ctrl Left Button & Mouse - Pan Camera \n\n Shift Left Button & Mouse - Move Camera In & Out\n\n",
					   "Help", MB_ICONINFORMATION | MB_TASKMODAL, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ) );
                break;
            }

            case 'W' :
            {
                m_bWireframe = !m_bWireframe;
				m_dwEffectDirtyFlags |= EBEFFECT_DIRTY_PUBLICSTATE;
                break;
            }

            case 'R' :
            {
                m_bWireframe = false;
				m_dwEffectDirtyFlags |= EBEFFECT_DIRTY_PUBLICSTATE;
                break;
            }

			case 'L':
			{
				m_Rotating = LIGHT_OBJECT;
                m_mUI->Reset();
				m_dwEffectDirtyFlags |= EBEFFECT_DIRTY_PUBLICSTATE;
				break;
			}

			case 'O':
			{
				m_Rotating = WOMAN_OBJECT;
                m_mUI->Reset();
				m_dwEffectDirtyFlags |= EBEFFECT_DIRTY_PUBLICSTATE;
				break;
			}

            case VK_HOME :
            case VK_END :
			case VK_NUMPAD7 :
			case VK_NUMPAD1 :
            case '7' :
            case '1' :
            {
                m_mUI->Reset();
                m_bWireframe = false;
				m_dwEffectDirtyFlags |= EBEFFECT_DIRTY_PUBLICSTATE;
                break;
            }

            case VK_LEFT :
			case VK_NUMPAD4 :
            case '4' :
            {
                m_mUI->Translate( -1.0f, 0.0f, 0.0f );
                break;
            }

            case VK_RIGHT :
			case VK_NUMPAD6 :
            case '6' :
            {
                m_mUI->Translate(  1.0f, 0.0f, 0.0f );
                break;
            }

            case VK_UP :
			case VK_NUMPAD8 :
            case '8' :
            {
                m_mUI->Translate(  0.0f, 0.0f, -1.0f );
                break;
            }

            case VK_DOWN :
			case VK_NUMPAD2 :
            case '2' :
            {
                m_mUI->Translate( 0.0f, 0.0f, 1.0f );
                break;
            }

            case VK_PRIOR :
			case VK_NUMPAD9 :
            case '9' :
            {
                m_mUI->Translate(  0.0f, 1.0f, 0.0f );
                break;
            }
            case VK_NEXT :
			case VK_NUMPAD3 :
            case '3' :
            {
                m_mUI->Translate(  0.0f, -1.0f, 0.0f );
                break;
            }

            case VK_ADD :
            {
                m_mUI->Translate( 0.0f, 0.0f, 1.0f );
                break;
            }
            case VK_SUBTRACT :
            {
                m_mUI->Translate( 0.0f, 0.0f, -1.0f );
                break;
            }

            default :
            {
                break;
            }
        };
    }
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -