我的InitD3D()

这段代码展示了如何创建窗口并初始化Direct3D对象和设备。首先创建窗口,然后通过Direct3DCreate9函数创建D3D对象。接着,根据全屏或窗口模式设置D3DPRESENT_PARAMETERS,并创建D3D设备。最后,设置渲染状态,包括启用Z缓存、光照处理和材质混合等。
//----------------------------------------------------------------------------------
// 功能:    创建窗口、初始化D3D对象和设备.
// 返回:    HRESULT
//----------------------------------------------------------------------------------
HRESULT CItemD3D_Manager::InitD3D()
{
    HRESULT    hr;
    
// 创建窗口
    CRect     wndRect(0,0,1024,768);

    m_pD3DWnd 
= new CItemD3D_Wnd(this);

    
if ( NULL == ( m_pD3DWnd->CreateEx(
        
0, AfxRegisterWndClass(0,NULL,NULL,NULL),
        
"D3DITEM", WS_CHILD | WS_VISIBLE & ~WS_BORDER, wndRect,
        CPage::s_pRightView, 
0, NULL) ) )
    {
        AfxMessageBox(
"ERROR! 窗口创建失败!");
        
return false;
    }
    m_pD3DWnd
->ShowWindow(SW_HIDE);

    
// 创建D3D对象
    if (NULL == (m_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
    {
        AfxMessageBox(
"ERROR! D3D对象创建失败!");
        
return false;
    }

    
// 创建D3D设备
    D3DPRESENT_PARAMETERS    d3dpp;
    D3DDISPLAYMODE            displayMode;
    hr 
= m_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &displayMode );
    ::ZeroMemory(
&d3dpp, sizeof(d3dpp));
    d3dpp.SwapEffect                
= D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferCount            
= 1;                // 仅需要一个备份缓冲区
    d3dpp.EnableAutoDepthStencil    = TRUE;
    d3dpp.AutoDepthStencilFormat    
= D3DFMT_D16;        // 生成16 bit的Z缓存
    if (m_bFullScreen)
    {
        d3dpp.Windowed 
= FALSE;
d3dpp.BackBufferWidth  = displayMode.Width;
            d3dpp.BackBufferWidth  = displayMode.Width;
            d3dpp.BackBufferHeight = displayMode.Height;
            d3dpp.BackBufferFormat = displayMode.Format;

    }
    
else
    {
        d3dpp.Windowed 
= TRUE;
        d3dpp.BackBufferFormat 
= displayMode.Format;
    }

    
if ( FAILED( hr = m_pD3D->CreateDevice(    
                        D3DADAPTER_DEFAULT,                    
// 使用缺省的显卡
                        D3DDEVTYPE_HAL,                        // 指定设备类型为HAL
                        m_pD3DWnd->m_hWnd,                    // Direct3D窗口的句柄
                        D3DCREATE_SOFTWARE_VERTEXPROCESSING,// 软件顶点处理
                        &d3dpp, 
                        
&m_pDevice) ) )
    {
        AfxMessageBox(
"ERROR! D3D设备创建失败!");
        
return hr;
    }

    
// 设置渲染状态 ------------------------->
    
// 启用Z缓存,允许消隐处理
    m_pDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE );
    
// 关闭“挑选”功能,允许渲染背面
    m_pDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
    
// 打开环境光照 
    m_pDevice->SetRenderState( D3DRS_AMBIENT, RGB(255,255,255) );
    
// 打开光照处理
    m_pDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
    
// 自动对法线矢量进行归一化处理
    m_pDevice->SetRenderState( D3DRS_NORMALIZENORMALS, TRUE );
    m_pDevice
->SetRenderState( D3DRS_SPECULARENABLE, true );
    m_pDevice
->SetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD );
    
// 启用材质阿尔法混合
    m_pDevice->SetRenderState( D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL );
    
//m_pDevice->SetRenderState( D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);
    
// <--------------------------设置渲染状态
    return true;
}
 
if (m_bFullScreen)
{
    d3dpp.Windowed            
= FALSE;
    d3dpp.BackBufferWidth    
= displayMode.Width;
    d3dpp.BackBufferHeight 
= displayMode.Height;
    d3dpp.BackBufferFormat 
= displayMode.Format;
}

else
{
    d3dpp.Windowed 
= TRUE;
    d3dpp.BackBufferFormat 
= displayMode.Format;
}
#include <windows.h> #include <d3d11.h> #include <d3dx11.h> #include <d3dx10.h> #pragma comment(lib, "d3d11.lib") #pragma comment(lib, "d3dx11.lib") #pragma comment(lib, "d3dx10.lib") // 全局变量 IDXGISwapChain* swapchain; // 用于交换前后缓冲区 ID3D11Device* device; // Direct3D设备 ID3D11DeviceContext* deviceContext; // 设备上下文 ID3D11RenderTargetView* renderTargetView; // 渲染目标视图 // 初始化Direct3D void InitD3D(HWND hwnd) { // 描述交换链 DXGI_SWAP_CHAIN_DESC swapChainDesc; ZeroMemory(&swapChainDesc, sizeof(swapChainDesc)); swapChainDesc.BufferCount = 1; swapChainDesc.BufferDesc.Width = 800; swapChainDesc.BufferDesc.Height = 600; swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; swapChainDesc.BufferDesc.RefreshRate.Numerator = 60; swapChainDesc.BufferDesc.RefreshRate.Denominator = 1; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.OutputWindow = hwnd; swapChainDesc.SampleDesc.Count = 1; swapChainDesc.SampleDesc.Quality = 0; swapChainDesc.Windowed = TRUE; // 创建交换链、设备和设备上下文 D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, NULL, 0, D3D11_SDK_VERSION, &swapChainDesc, &swapchain, &device, NULL, &deviceContext); // 创建渲染目标视图 ID3D11Texture2D* backBuffer; swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBuffer); device->CreateRenderTargetView(backBuffer, NULL, &renderTargetView); backBuffer->Release(); // 设置渲染目标视图 deviceContext->OMSetRenderTargets(1, &renderTargetView, NULL); // 设置视口 D3D11_VIEWPORT viewport; ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT)); viewport.TopLeftX = 0; viewport.TopLeftY = 0; viewport.Width = 800; viewport.Height = 600; deviceContext->RSSetViewports(1, &viewport); } // 清理Direct3D资源 void CleanD3D() { swapchain->Release(); device->Release(); deviceContext->Release(); renderTargetView->Release(); } // 渲染场景 void RenderFrame() { // 清空渲染目标视图 float color[4] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 红色 deviceContext->ClearRenderTargetView(renderTargetView, color); // 呈现交换链 swapchain->Present(0, 0); } // Windows窗口过程函数 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, msg, wParam, lParam); } // 主函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 注册窗口类 WNDCLASSEX wc; ZeroMemory(&wc, sizeof(WNDCLASSEX)); wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.lpszClassName = L"DirectX11WindowClass"; RegisterClassEx(&wc); // 创建窗口 HWND hwnd = CreateWindowEx(NULL, L"DirectX11WindowClass", L"DirectX 11 Red Rose", WS_OVERLAPPEDWINDOW, 300, 300, 800, 600, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); // 初始化Direct3D InitD3D(hwnd); // 消息循环 MSG msg; ZeroMemory(&msg, sizeof(MSG)); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); RenderFrame(); } // 清理Direct3D资源 CleanD3D(); return msg.wParam; }严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E1696 无法打开 源 文件 "d3dx11.h" DirectX 11 E:\2025大三\3d\玫瑰\DirectX 11\main.cpp 3 错误(活动) E1696 无法打开 源 文件 "d3dx10.h" DirectX 11 E:\2025大三\3d\玫瑰\DirectX 11\main.cpp 4 错误 C1083 无法打开包括文件: “d3dx11.h”: No such file or directory DirectX 11 E:\2025大三\3d\玫瑰\DirectX 11\main.cpp 3
最新发布
10-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值