📄 shader_brdf.cpp
字号:
{
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 + -