o Direct3D được thiết kế với mục đích là cung cấp sự truy cập độc lập thiết bị tới các phần cứng đồ hoạ 3D, có thể hiểu Direct3D là một giao thức cho việc vẽ trên phần cứng 3D.. 1.2 Tạo
Trang 1Hà Minh Trung: 20115801
Trang 2Microsoft DirectX là một tập hợp các giao diện lập trình ứng dụng (API) để xử lý các nhiệm vụ liên quan đến đa phương tiện, đặc biệt là chương trình trò chơi và video trên nền tảng của Microsoft
Direct3D (API đồ họa 3D trong DirectX) được sử dụng rộng rãi trong việc phát triển trò chơi video cho Microsoft
Windows, Microsoft Xbox, và Microsoft Xbox 360.
Do Direct3D là thành phần công bố công khai rộng rãi nhất của DirectX, người ta thường xem tên gọi "DirectX" và
"Direct3D" được sử dụng thay thế cho nhau.
Trang 3o Direct3D được thiết kế với mục đích là cung cấp sự truy cập độc lập thiết bị tới các phần cứng đồ hoạ 3D, có thể hiểu Direct3D là một giao thức cho việc vẽ trên phần cứng 3D
o Có thể sử dụng Direct3D ở hai chế độ: Immediate Mode và
Retained Mode
o Imediate Mode là một API 3D ở mức độ thấp để liên hệ với thiết bị tăng tốc đồ họa Immediate Mode là lý tưởng cho những nhà phát triển muốn lập chương trình với chất lượng cao trong Windows.
o Retained Mode là một API 3D ở mức cao dành cho các nhà lập trình cần viết nhanh hoặc muốn sử dụng tính năng hỗ trợ về hoạt hình,
Retained Mode được thiết kế ngay trên nền của Immediate Mode
Trang 4Hệ thống thư viện API của DirectX được phân chia ra làm nhiều thành phần nhỏ, mỗi thành phần này đảm nhiệm những nhiệm vụ khác nhau của hệ thống.
Trang 5Lớp HAL cung cấp một giao diện đã được chuẩn hoá cho
DirectX, ngoài ra nó có khả năng “nói chuyện” trực tiếp với phần cứng thông qua các xác lập đối với các loại thiết bị điều khiển của chính nó.
Trang 6Mô hình phân l pDirect3D ớ
Trang 7I.Xây dựng ứng dụng đồ họa 3D với Direct 3D
1.1 Khai báo biến giao diện direct3D với ComPtr
Chúng ta khai báo các biện giao diện Driect 3D với ComPtr vì vậy
có thể quản lý các biến trong một cách an toàn ngoại lệ Sau đó
chúng ta có thể sử dụng các biến để truy cập vào lớp ComPtr và các thành viên của nó
Trang 8);
Trang 9Nếu bạn khai báo ID3D11 RenderTargetView với ComPtr, sau đó bạn có thể sử dụng ComPtr của GetAddress0f phương pháp để có được địa chỉ con trỏ đến ID3D11 RenderTargetView để vượt qua ID3D11DeviceContext :: > OMSet Render Targets OMSet
RenderTargets liên kết với các mục tiêu trả cho các giai đoạn đầu
ra – sát nhập để xác định làm mục tiêu là mục tiêu đầu ra.
Sau đó ứng dụng mẫu được bắt đầu, nó khởi động và tải, sau đó sẵn sàng để chạy.
Trang 101.2 Tạo các thiết bị Direct 3D
Sử dụng API Direct3D để render một cảnh, đầu tiên chúng ta phải tạo
ra một thiết bị Direct3D đại diện cho các bộ chuyển đổi màn hình
hiển thị Để tạo ra các thiết bị Direct3D, chúng ta gọi là
D3D11CreateDevice chức năng Direct3D mảng theo thứ tự và trả về
mức độ tính năng hỗ trợ cao nhất.Vì vậy, để có được mức độ tính
năng cao nhất, chúng ta liệt kê các D3D_FEATURE_LEVER mục
mảng từ cao nhất
Trang 11/ / Đầu tiên, tạo các thiết bị Direct3D
/ / Cờ này là cần thiết để cho phép khả năng tương thích với Direct2D
UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
# if được định nghĩa (_DEBUG)
/ / Nếu dự án là trong một gỡ lỗi xây dựng, cho phép gỡ lỗi thông qua lớp SDK với cờ này
ComPtr <ID3D11Device> d3dDevice;
ComPtr <ID3D11DeviceContext> d3dDeviceContext;
Trang 12nullptr , / / để lại như nullptr nếu phần cứng được sử dụng
creationFlags, / / tùy chọn thiết lập gỡ lỗi và
/ / Lấy Direct3D 11.1 giao diện.
DX :: ThrowIfFailed (d3dDevice.As (& m_d3dDevice));
DX :: ThrowIfFailed ( d3dDeviceContext.As (&
m_d3dDeviceContext));
Trang 131.3 Tạo chuỗi trao đổi
Tiếp theo chúng ta tạo ra một chuỗi trao đổi rằng các thiết
bị sử dụng để biểu diễn và màn hình hiển thị Chúng ta khai
báo và khởi tạo một DXGI_SWAP_CHAIN_DESC1 cấu
trúc để mô tả chuỗi trao đổi Sau đó, thiết lập các chuỗi trao đổi như flip – mô hình (đó là một chuỗi trao
đổi có DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL giá trị thiết lập trong SwapEffect thành viên) và thiết lập định
dạng thành viên DXGI_FORMAT_B8G8R8A8_UNORM.
Trang 14/ / Nếu chuỗi trao đổi không tồn tại, tạo ra nó.
Trang 15/ / tạo ra trên các bộ chuyển đổi tương tự như các thiết bị D3D hiện có
/ / Trước tiên, lấy các thiết bị DXGI cơ bản từ các thiết bị D3D
ComPtr <IDXGIDevice2> dxgiDevice;
DX :: ThrowIfFailed ( m_d3dDevice.As (& dxgiDevice) );
Trang 16/ / Đảm bảo rằng DXGI không xếp hàng nhiều hơn một khung tại một thời điểm Cả hai điều này làm giảm / / độ trễ và đảm bảo rằng các ứng dụng sẽ chỉ làm cho sau mỗi VSync, giảm thiểu tiêu thụ / / sức mạnh
DX :: ThrowIfFailed ( dxgiDevice-> SetMaximumFrameLatency (1) );
/ / Tiếp theo, các nhà máy sản xuất phụ huynh từ các thiết bị DXGI
ComPtr <IDXGIAdapter> dxgiAdapter;
DX :: ThrowIfFailed ( dxgiDevice-> GetAdapter (& dxgiAdapter) );
ComPtr <IDXGIFactory2> dxgiFactory;
DX :: ThrowIfFailed ( dxgiAdapter-> GetParent (IID_PPV_ARGS (& dxgiFactory)) );
/ / Cuối cùng, tạo ra chuỗi trao đổi
CoreWindow ^ cửa sổ = m_window.Get ();
DX :: ThrowIfFailed ( dxgiFactory-> CreateSwapChainForCoreWindow
(m_d3dDevice.Get (),
reinterpret_cast <IUnknown*> (cửa sổ),& SwapChainDesc,
nullptr , / / cho phép trên tất cả các màn
& M_swapChain
)
);
Trang 171.4 Tạo điểm làm mục tiêu
Để render đồ họa vào cửa sổ, chúng ta phải tạo một cái nhìn làm mục tiêu.Gọi IDXGISwapChain::GetBuffer để có được bộ đệm trở
lại chuỗi trao đổi để sử dụng ta tạo ra các điểm làm mục tiêu Xác
định các bộ đệm trở lại như một kết cấu 2D (ID3D11Texture2D) Để tạo ra các điểm làm mục tiêu, chúng ta gọi ID3D11Device ::
CreateRenderTargetView Chúng ta phải xác định để vẽ cho toàn bộ cửa sổ lõi bằng cách xác định cổng (D3D11_VIEWPORT).
Trang 18/ / Một khi các chuỗi trao đổi được tạo ra, tạo ra một cái nhìn mục tiêu làm Điều này sẽ / / cho phép Direct3D để render đồ họa vào cửa sổ.
ComPtr <ID3D11Texture2D> backBuffer;
DX :: ThrowIfFailed (m_swapChain-> GetBuffer (0, IID_PPV_ARGS (& backBuffer)) );
DX :: ThrowIfFailed ( m_d3dDevice-> CreateRenderTargetView (backBuffer.Get (),
nullptr ,
& M_renderTargetView
)
); / / Sau khi xem mục tiêu làm được tạo ra, xác định rằng các khung nhìn,
/ / trong đó mô tả những phần của cửa sổ để vẽ, nên bao gồm
viewport.Width = static_cast < nổi > (backBufferDesc.Width);
viewport.Height = static_cast < nổi > (backBufferDesc.Height);
viewport.MinDepth = D3D11_MIN_DEPTH;
viewport.MaxDepth = D3D11_MAX_DEPTH;
m_d3dDeviceContext-> RSSetViewports (1, và khung nhìn);
Trang 191.5 Trình bày ảnh kết suất
Chúng ta bước vào một vòng lặp vô tận để liên tục đưa ra và
hiển thị các cảnh
1.ID3D11 DeviceContext :: OMSetRenderTargets để xác
định mục tiêu trả lại như mục tiêu đầu ra.
2 ID3D11 DeviceContext :: ClearRenderTargetView để xóa
các mục tiêu khiến cho một màu.
3.IDXGISwapChain :: hiện tại để trình bày các hình ảnh kết
xuất ra cửa sổ
Trang 20/ / Nhập các vòng lặp render Lưu ý rằng Windows cửa hàng ứng dụng không bao giờ thoát
Whlie( true )
{ Sự kiện / / Xử lý incoming vào cửa sổ
m_window-> dispatcher-> ProcessEvents (CoreProcessEventsOption :: ProcessAllIfPresent);
/ / Xác định mục tiêu làm cho chúng ta được tạo ra như là mục tiêu đầu ra
m_d3dDeviceContext-> OMSetRenderTargets (1, m_renderTargetView.GetAddressOf (),
nullptr / / sử dụng không stencil sâu
); / / Xoá render mục tiêu vào một màu
const float clearColor [4] = {0.071f, 0.04f, 0.561f, 1.0f};
m_d3dDeviceContext-> ClearRenderTargetView ( m_renderTargetView.Get (), clearColor
/ / Trình bày các hình ảnh kết xuất ra cửa sổ Bởi vì độ trễ khung tối đa được thiết lập để 1,
/ / vòng lặp render sẽ thường được tăng cường với tốc độ làm tươi màn hình, thường là khoảng
/ / 60Hz, bằng cách ngủ các ứng dụng trên hiện tại cho đến khi màn hình được làm mới
DX :: ThrowIfFailed ( m_swapChain-> hiện tại (1, 0) );
}
Trang 211.6 Thay đổi kích thước cửa sổ ứng dụng và vùng đệm chuỗi trao đổi cửa
Nếu kích thước của cửa sổ ứng dụng thay đổi, các ứng dụng phải thay đổi kích thước
bộ đệmchuỗi trao đổi, tái tạo xem làm mục tiêu Và sau đó trình bày các hình ảnh kết suất
Trang 221.Khối Môi trường Mapping
Bản đồ môi trường khối - đôi khi được gọi là bản đồ khối lập phương - là kết cấu
có chứa dữ liệu hình ảnh đại diện cho cảnh xung quanh một đối tượng,
như nếu đối tượng là ở trung tâm của một khối lập phương
Mỗi mặt của bản đồ môi trường khối bao gồm một lĩnh vực 90 độ nhìn trong ngang
và dọc,
và có sáu khuôn mặt mỗi bản đồ khối lập phương.Định hướng trong những mặt
được thể hiện trong hình minh họa sau đây
II Thiết lập môi
Trang 23trường Mỗi mặt của khối lập phương được định hướng vuông góc với x / y, y / z,
hoặc x / z máy bay, trong không gian thế giới.Hình minh họa sau đây cho thấy làm thế nào mỗi máy bay tương ứng với một mặt
Trang 24•Mipmapped Maps Môi trường Cubic
Bản đồ khối có thể được mipmapped Để tạo ra một bản đồ khối mipmapped, thiết lập các
tham số cấp độ của method CreateCubeTexture để mức mà bạn muốn Bạn có thể hình dung
các bề mặt được thể hiện trong biểu đồ dưới đây
Các ứng dụng tạo ra các bản đồ môi trường khối mipmapped có thể truy cập vào từng mặt
bằng cách gọi method GetCubeMapSurface Bắt đầu bằng cách thiết lập giá trị thích hợp
từ D3DCUBEMAP_FACES và liệt kê loại Tiếp theo, chọn mức độ bằng cách
thiết lập GetCubeMapSurface -tham số mức độ đến mức mipmap mà bạn muốn
Trang 25• Tọa độ kết cấu cho Maps Môi trường khối
Kết cấu tọa độ của bản đồ môi trường khối không đơn giản như tọa độ u, style tọa độ v, như được sử dụng khi kết cấu tiêu chuẩn được áp dụng Trong thực tế, bản đồ môi trường khối không sử dụng kết cấu tọa độ ở tất cả Ở vị trí của một tập hợp các tọa độ kết cấu, bản đồ môi trường khối đòi hỏi một vector 3D Bạn cần phải xác định một định dạng đỉnh
thích hợp Ngoài báo cho hệ thống có bao nhiêu bộ kết cấu tọa độ sử dụng ứng dụng của bạn, bạn phải cung cấp thông tin về chi tiết yếu tố trong mỗi
bộ Direct3D cung
cấp D3DFVF_TEXCOORDSIZEN bộ macros cho mục đích này Các macros
chấp nhận một tham số duy nhất, xác định các chỉ số của các kết cấu phối hợp thiết lập mà kích thước đang được mô tả Trong trường hợp của một vector 3D, các mẫu được tạo ra bởi các macros D3DFVF_TEXCOORDSIZE3
Trang 26/ / Tạo một mô tả định dạng đỉnh linh hoạt cho một đỉnh có chứa
/ / Một vị trí, bình thường, và một tập hợp các kết cấu tọa độ 3D
DWORD dwFVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3 (0);
Ví dụ mã sau cho thấy cách vĩ mô này được sử dụng
Trang 271.2 Tạo Môi trường Bản đồ khối bề mặt
Bạn tạo ra một kết cấu bản đồ môi trường khối bằng cách gọi CreateCubeTexture
Ví dụ mã sau cho thấy cách ứng dụng của bạn có thể tạo ra
một bản đồ môi trường khối đơn giản.
/ / Init m_d3dDevice để trỏ đến một giao diện IDirect3DDevice9
LPDIRECT3DCUBETEXTURE9 m_pCubeMap;
m_d3dDevice-> CreateCubeTexture (256, 1, D3DUSAGE_RENDERTARGET,
D3DFMT_R8G8B8, D3DPOOL_DEFAULT,& m_pCubeMap);
Trang 28•Truy cập môi trường bản đồ khối
Bạn có thể di chuyển giữa các khuôn mặt của một bản đồ môi trường khối
m_pCubeMap-> GetCubeMapSurface (D3DCUBEMAP_FACE_POSITIVE_Y, 0, & pFace2);
Tham số đầu tiên mà GetCubeMapSurface chấp nhận là một D3DCUBEMAP_FACES
giá trị liệt kê mô tả bề mặt kèm theo đó phương pháp này nên lấy Tham số thứ hai cho Direct3D mà mức độ của một kết cấu khối mipmapped để lấy.Tham số thứ ba được
chấp nhận là địa chỉ của giao diện IDirect3DSurface9 , tham số quan trọng cho bề mặt
kết cấu khối lập phương
Trang 29•Ra vào Bản đồ Môi trường khối
Bạn có thể sao chép ảnh vào các mặt của bản đồ khối giống như bạn kết cấu
bất kỳ bề mặt hoặc đối tượng khác Điều quan trọng nhất để làm trước khi vẽ một
mặt được thiết lập các ma trận chuyển đổi để các ảnh được đặt đúng vị trí và điểm
theo hướng thích hợp cho mặt: về phía trước (+ z), hậu (-z),bên trái (-x) , bên phải (+ x), bên trên (+ y), hướng xuống (-y)
Ví dụ: chuẩn bị và thiết lập một ma trận điểm theo mặt được trả lại
/ / Init pCubeMap để trỏ đến một giao diện IDirect3DCubeTexture9
/ / Init d3dDevice để trỏ đến một giao diện IDirect3DDevice9
void RenderFaces()
{
/ / Lưu ma trận biến đổi của thiết bị
D3DXMATRIX matProjSave, matViewSave;
d3dDevice-> GetTransform (D3DTS_VIEW, & matViewSave;
d3dDevice-> GetTransform (D3DTS_PROJECTION, & matProjSave);
/ / Lưu trữ các buffer and z-buffer (bộ đệm)
LPDIRECT3DSURFACE9 pBackBuffer, pZBuffer;
d3dDevice-> GetRenderTarget (& pBackBuffer);
d3dDevice-> GetDepthStencilSurface (& pZBuffer);
Trang 30Khi ảnh đang ở vị trí và các thiết lập ma trận chiếu, bạn có thể làm khung cảnh.Mỗi đối tượng trong khung cảnh nên được đặt như bình thường vị trí của nó.
Ví dụ mã sau, cung cấp cho đầy đủ, vạch ra nhiệm vụ này
/ / Lấy con trỏ đến bề mặt để trả cho nó
/ / Render cảnh ở đây d3dDevice-> EndScene ();
} / / Thay đổi mục tiêu làm cho trở lại bộ đệm chính
d3dDevice-> SetRenderTarget (pBackBuffer, pZBuffer);
SAFE_RELEASE (pBackBuffer); SAFE_RELEASE (pZBuffer);
/ / Khôi phục các ma trận chuyển đổi ban đầu
d3dDevice-> setTransform (D3DTS_VIEW, & matViewSave);
d3dDevice-> setTransform (D3DTS_PROJECTION, & matProjSave);
}
Trang 31Các b ướ c thi t l p môi tr ế ậ ườ ng làm
Tải thư viện Direct3D tại địa chỉ
http://www.microsoft.com/en-US/download/details.aspx?id= 34429
Sau đó, ta tiến hành cài đặt như bình thường.
Để tạo một ứng dụng đơn giản:
Trong menu file ta chọn New -> Project.
Trang 32Đặt tên cho ứng dụng là ThucHanhDirect3D và nhấn OK
Trang 33- Để sử dụng các tiện ích của bộ thư viện DirectX :
- Chọn mục References trong khung bên phải Nhấn chuột phải và chọn Add References.
- Một cửa sổ được tạo ra, ta sẽ nhấn Browse và chọn đường dẫn tới thư viện Direct và Direct3D, rồi nhấn Add:
Sau đó, vào lớp game1.cs trong Project vừa tạo, khai báo các thư viện:
Using Microsoft.Direct;
Using Microsoft.Direct.Direct3D.
Trang 34Môi tr ườ ng làm vi c v i Direct3D ệ ớ
Trang 35 Xin chân thành c m n th y và các b n đã ả ơ ầ ạ