void CDiffusedShader::BuildObjects(ID3D11Device *pd3dDevice) { m_nObjects = 1; m_ppObjects = new CGameObject*[m_nObjects]; //탱크 몸체, 포탑은 육면체 메쉬, 포신은 원통 메쉬로 생성한다. CCylinderMesh *pGunMesh = new CCylinderMesh(pd3dDevice, 0x00, 2.0f, 7.0f, 20.0f, 1, RANDOM_COLOR); CCubeMesh *pTurretMesh = new CCubeMesh(pd3dDevice, 10.0f, 8.0f, 7.0f, RANDOM_COLOR); CCubeMesh *pBodyMesh = new CCubeMesh(pd3dDevice, 20.0f, 8.0f, 12.0f, RANDOM_COLOR); //CSphereMesh *pBallMesh = new CSphereMesh(pd3dDevice, 2.5f, 10, 10, D3DCOLOR_XRGB(0, 0, 128)); //탱크 객체를 생성한다. CTankObject *pTankObject = new CTankObject(); pTankObject->SetMesh(pBodyMesh); pTankObject->SetPosition(1028, 100, 1028); //포탑 객체를 생성하고 탱크 객체의 자식으로 설정한다. 포탑의 위치를 탱크에 상대적으로 표현한다. CTurretObject *pTurretObject = new CTurretObject(); pTurretObject->SetMesh(pTurretMesh); pTurretObject->SetPosition(1028.0f, 100+(48.0f + 56.0f)*0.5f, 1028.0f); pTankObject->SetChild(pTurretObject); //포신 객체를 포탑 객체의 자식으로 설정한다. 포신의 위치를 포탑에 상대적으로 표현한다. CGunObject *pGunObject = new CGunObject(); pGunObject->SetMesh(pGunMesh); pGunObject->SetPosition(1028.0f + -(120.0f + 60.0f)*0.5f, 100 + (48.0f + 56.0f)*0.5f, 1028.0f); pTurretObject->SetChild(pGunObject); m_ppObjects[0] = pTankObject; CreateShaderVariables(pd3dDevice); }
void CShader::CreateShader(ID3D11Device *pd3dDevice) { D3D11_INPUT_ELEMENT_DESC d3dInputLayout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 } }; UINT nElements = ARRAYSIZE(d3dInputLayout); CreateVertexShaderFromCompiledFile(pd3dDevice, L"VS.fxo", d3dInputLayout, nElements); CreatePixelShaderFromCompiledFile(pd3dDevice, L"PS.fxo"); //컴파일된 쉐이더 코드의 이름이 VS.fxo와 PS.fxo이다. CreateShaderVariables(pd3dDevice); }
void CShader::CreateShader(ID3D11Device *pd3dDevice) { /*IA 단계에 설정할 입력-레이아웃을 정의한다. 정점 버퍼의 한 원소가 CVertex 클래스의 멤버 변수(D3DXVECTOR3 즉, 실수 세 개)이므로 입력-레이아웃은 실수(32-비트) 3개로 구성되며 시멘틱이 “POSITION”이고 정점 데이터임을 표현한다.*/ D3D11_INPUT_ELEMENT_DESC d3dInputLayout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 } }; UINT nElements = ARRAYSIZE(d3dInputLayout); //파일 “Effect.fx”에서 정점-쉐이더의 시작 함수가 "VS"인 정점-쉐이더를 생성한다. CreateVertexShaderFromFile(pd3dDevice, L"Effect.fx", "VS", "vs_5_0", &m_pd3dVertexShader, d3dInputLayout, nElements, &m_pd3dVertexLayout); //파일 “Effect.fx”에서 픽셀-쉐이더의 시작 함수가 "PS"인 픽셀-쉐이더를 생성한다. CreatePixelShaderFromFile(pd3dDevice, L"Effect.fx", "PS", "ps_5_0", &m_pd3dPixelShader); CreateShaderVariables(pd3dDevice); }
void CIlluminatedShader::BuildObjects(ID3D11Device *pd3dDevice) { //객체들의 물질의 색상은 빨강색, 녹색, 파란색이다. CMaterial **ppMaterials = new CMaterial*[3]; ppMaterials[0] = new CMaterial(); ppMaterials[0]->m_Material.m_d3dxcDiffuse = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f); ppMaterials[0]->m_Material.m_d3dxcAmbient = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f); ppMaterials[0]->m_Material.m_d3dxcSpecular = D3DXCOLOR(1.0f, 1.0f, 1.0f, 5.0f); ppMaterials[0]->m_Material.m_d3dxcEmissive = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f); ppMaterials[1] = new CMaterial(); ppMaterials[1]->m_Material.m_d3dxcDiffuse = D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f); ppMaterials[1]->m_Material.m_d3dxcAmbient = D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f); ppMaterials[1]->m_Material.m_d3dxcSpecular = D3DXCOLOR(1.0f, 1.0f, 1.0f, 10.0f); ppMaterials[1]->m_Material.m_d3dxcEmissive = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f); ppMaterials[2] = new CMaterial(); ppMaterials[2]->m_Material.m_d3dxcDiffuse = D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f); ppMaterials[2]->m_Material.m_d3dxcAmbient = D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f); ppMaterials[2]->m_Material.m_d3dxcSpecular = D3DXCOLOR(1.0f, 0.0f, 1.0f, 10.0f); ppMaterials[2]->m_Material.m_d3dxcEmissive = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f); CCubeMeshIlluminated *pCubeMeshIlluminated = new CCubeMeshIlluminated(pd3dDevice, 12.0f, 12.0f, 12.0f); CSphereMeshIlluminated *pSphereMeshIlluminated = new CSphereMeshIlluminated(pd3dDevice, 12.0f, 40, 40); int i = 0; m_nObjects = 1; m_ppObjects = new CGameObject*[m_nObjects]; //지형을 확대할 스케일 벡터이다. x-축과 z-축은 8배, y-축은 2배 확대한다. D3DXVECTOR3 d3dxvScale(8.0f, 2.0f, 8.0f); D3DXCOLOR d3dxColor(0.0f, 0.2f, 0.0f, 0.0f); /*지형을 높이 맵 이미지 파일을 사용하여 생성한다. 높이 맵 이미지의 크기는 가로x세로(257x257)이고 격자 메쉬의 크기는 가로x세로(17x17)이다. 지형 전체는 가로 방향으로 16개, 세로 방향으로 16의 격자 메쉬를 가진다. 지형을 구성하는 격자 메쉬의 개수는 총 256(16x16)개가 된다.*/ m_pTerrain = new CHeightMapTerrain(pd3dDevice, _T("Data\\HeightMap.raw"), 257, 257, 17, 17, d3dxvScale, d3dxColor); m_pTerrain->SetMaterial(ppMaterials[1]); m_ppObjects[i++] = m_pTerrain; CreateShaderVariables(pd3dDevice); delete[] ppMaterials; }
void CScene::BuildObjects( ID3D11Device *pd3dDevice ) { // 사운드 로딩 및 출력 LoadingSoundResource( ); SoundManager::GetInstance( )->Play( BGM ); // 텍스처 맵핑에 사용할 샘플러 상태 객체를 생성 ID3D11SamplerState *pd3dSamplerState = NULL; D3D11_SAMPLER_DESC d3dSamplerDesc; ::ZeroMemory( &d3dSamplerDesc, sizeof( D3D11_SAMPLER_DESC ) ); d3dSamplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; d3dSamplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; d3dSamplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; d3dSamplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; d3dSamplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; d3dSamplerDesc.MinLOD = 0; d3dSamplerDesc.MaxLOD = 0; pd3dDevice->CreateSamplerState( &d3dSamplerDesc, &pd3dSamplerState ); // fbx loader를 통한 fbx로딩 LoadFBXs( ); std::vector<CFbxMesh> background; std::vector<CFbxMesh> enemy; std::vector<CFbxMesh> npc; for (int i = 0; i < m_nFbxCount; i++) { CFbxMesh tempMesh = FBXManager::GetInstance( )->m_pMeshes[i]; int layer = tempMesh.m_iLayer; switch (layer) { case ObjectLayer::LAYER_BACKGROUND: { background.push_back( tempMesh ); break; } case ObjectLayer::LAYER_ENEMY: { enemy.push_back( tempMesh ); break; } case ObjectLayer::LAYER_NPC: { npc.push_back( tempMesh ); break; } default: break; } } FBXManager::GetInstance( )->ClearMeshes( ); // 현재 셰이더 개수에 fbx개수를 더한 뒤 셰이더를 생성하여 만듬 m_nShaders = 2; // 0은 스카이박스 , 1은 배경, 2는 엔피시, 3은 적 m_ppShaders = new CShader*[m_nShaders]; // 첫번째로 그릴 객체는 스카이박스 m_ppShaders[0] = new CSkyBoxShader( ); m_ppShaders[0]->CreateShader( pd3dDevice ); m_ppShaders[0]->BuildObjects( pd3dDevice ); // 두번째는 배경 m_ppShaders[1] = new CBackgroundShader( ); m_ppShaders[1]->CreateShader( pd3dDevice ); ( (CBackgroundShader*)m_ppShaders[1] )->BuildObjects( pd3dDevice, background ); CreateShaderVariables( pd3dDevice ); }