DirectX11 With Windows SDK 07添加光照與常用幾何模型、光柵化狀態(tài) 課后作業(yè)
本文是DirectX11 With Windows SDK 07添加光照與常用幾何模型、光柵化狀態(tài) 的課后作業(yè)
答案僅供參考
原文鏈接:DirectX11 With Windows SDK 07添加光照與常用幾何模型、光柵化狀態(tài)
嘗試修改本章Demo的光照,讓方向光只射出紅光,點光燈只射出綠光,聚光燈只射出藍光。
// 方向光 紅色 m_DirLight.ambient = XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f); m_DirLight.diffuse = XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f); m_DirLight.specular = XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f); m_DirLight.direction = XMFLOAT3(-0.577f, -0.577f, 0.577f); // 點光 綠色 m_PointLight.ambient = XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f); m_PointLight.diffuse = XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f); m_PointLight.specular = XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f); // 聚光燈 藍色 m_SpotLight.ambient = XMFLOAT4(0.0f, 0.0f, 0.0f, 1.0f); m_SpotLight.diffuse = XMFLOAT4(0.0f, 0.0f, 1.0f, 1.0f); m_SpotLight.specular = XMFLOAT4(0.0f, 0.0f, 1.0f, 0.f);
嘗試修改本章Demo所用到的材質,讓其只反射紅光。
// 初始化用于PS的常量緩沖區(qū)的值 // 將 diffuse 或者 ambient 或者 specular 修改為 1.0, 0 , 0 即可 下面代碼我只修改了 diffuse m_PSConstantBuffer.material.ambient = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f); m_PSConstantBuffer.material.diffuse = XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f); m_PSConstantBuffer.material.specular = XMFLOAT4(0.5f, 0.5f, 0.5f, 5.0f);
嘗試修改本章Demo所用到的聚光燈,通過鼠標滾輪的形式,對光照匯聚強度增加/減少,范圍為2-512,觀察效果。
// 我的代碼并沒有按照 2-512的范圍去弄 所以僅供參考 //UpdateScene函數(shù) // 獲取鼠標狀態(tài) Mouse::State mouseState = m_pMouse->GetState(); Mouse::State lastMouseState = m_MouseTracker.GetLastState(); m_MouseTracker.Update(mouseState); static float d = 15.0f; d -= mouseState.scrollWheelValue/360.0f; m_pMouse->ResetScrollWheelValue(); //之后在聚光燈的條件語句中添加 m_PSConstantBuffer.spotLight.spot = d; // 注:需要不斷的去按 3 滑動滾輪才能看出效果
嘗試修改本章Demo所用到的材質,看看如果鏡面反射強度的值小于1會發(fā)生什么情況。
無
實現(xiàn)一個函數(shù)用于創(chuàng)建膠囊(capsule)幾何體,需要指定上下半球的半徑(radius)、柱體部分高度(height)、球面三角形切片數(shù)(slices)和上下半球的層級數(shù)(levels),并且實現(xiàn)頂點要包含位置(position)、法向量(normal)。若已經(jīng)接觸過紋理映射與法線貼圖,則可以考慮額外實現(xiàn)紋理坐標(texcoord)和切線向量(tangent)
評論區(qū)
利用光柵化狀態(tài),嘗試同時畫出立方體和其三角形邊界(題圖無光照)
//思路就是 分兩次draw,第一次為線框模式,第二次繪制實體,而且線框和實體不能使用一個顏色 //1. 在UpdateScene() 中添加 // 設置 光柵化狀態(tài) 以及顏色值 m_pd3dImmediateContext->RSSetState(m_pRSWireframe.Get()); m_PSConstantBuffer.material.diffuse = XMFLOAT4(0.0f, 0.0f, 0.0f,0.0f); //2. DrawScene 添加如下代碼 // 第一次繪制 m_pd3dImmediateContext->DrawIndexed(m_IndexCount, 0, 0); // 第二次繪制 m_pd3dImmediateContext->RSSetState(nullptr); // 顏色更改為白色 m_PSConstantBuffer.material.diffuse = XMFLOAT4(1.0f, 1.0f, 1.0f, 0.0f); D3D11_MAPPED_SUBRESOURCE mappedData; HR(m_pd3dImmediateContext->Map(m_pConstantBuffers[1].Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedData)); memcpy_s(mappedData.pData, sizeof(PSConstantBuffer), &m_PSConstantBuffer, sizeof(PSConstantBuffer)); m_pd3dImmediateContext->Unmap(m_pConstantBuffers[1].Get(), 0); // 繪制幾何模型 m_pd3dImmediateContext->DrawIndexed(m_IndexCount, 0, 0);
圖形學碎碎念 文章被收錄于專欄
學習圖形學