Tải bản đầy đủ (.pptx) (35 trang)

BÁO CÁO THỰC TẬP-XÂY DỰNG ỨNG DỤNG 3D VỚI DIRECT 3D

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (476.42 KB, 35 trang )

Đ tài16ề
Xây d ng ng d ng 3D v i Direct 3Dự ứ ụ ớ
Nhóm sinh viên thực hiện:
Vũ Hữu Lực: 20115629
Lê Cao Kỳ: 20115609
Nguyễn Mậu Ngọc: 20115676
Hà Minh Trung: 20115801
Microsoft 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.
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.
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.
Hệ 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.

DirectX Graphic

DirectInput

DirectPlay

DirectSound

DirectMusic

DirectShow

DirectSetup
Ki n trúc c a DirectXế ủ
Nền tảng của DirectX bao gồm 2 lớp: lớp hàm API và lớp
(giao diện) thiết bị (HAL–Hardware Abstraction Layer).
Các hàm trên lớp API sẽ kết nối tới phần cứng thông qua lớp
HAL.
Lớ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ó.
Mô hình phân l pDirect3Dớ
I.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ó .
VÍ DỤ:
ComPtr < ID3D11 RenderTarget View> m_renderTargetView;
m_d3dDeviceContext- > OMSet RenderTargets (
1,
m_renderTargetView.GetAddress0f ( ) ,
nullptr
);

Nế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.

1.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 .


/ / Đầ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.
creationFlags | = D3D11_CREATE_DEVICE_DEBUG;
# Endif

/ / Mảng này xác định thứ tự của các cấp tính năng D3D nên cố gắng tạo ra.
D3D_FEATURE_LEVEL featureLevels [] =
{
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_9_3,
D3D_FEATURE_LEVEL_9_1
};

ComPtr <ID3D11Device> d3dDevice;
ComPtr <ID3D11DeviceContext> d3dDeviceContext;

DX :: ThrowIfFailed (

D3D11CreateDevice (
nullptr , / / chỉ định nullptr sử dụng các bộ chuyển đổi mặc
định

nullptr , / / để 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à
Direct2D cờ tương thích
featureLevels,
ARRAYSIZE (featureLevels),
D3D11_SDK_VERSION, / / luôn luôn thiết lập này để
D3D11_SDK_VERSION

& D3dDevice,
nullptr ,
& D3dDeviceContext
)
);

/ / Lấy Direct3D 11.1 giao diện.
DX :: ThrowIfFailed (d3dDevice.As (& m_d3dDevice));

DX :: ThrowIfFailed ( d3dDeviceContext.As (&
m_d3dDeviceContext));

1.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.
/ / Nếu chuỗi trao đổi không tồn tại, tạo ra nó.

DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
swapChainDesc.Stereo = false ;

swapChainDesc.BufferUsage=DXGI_USAGE_RENDER_TARGET_
OUTPUT;
swapChainDesc.Scaling = DXGI_SCALING_NONE;
swapChainDesc.Flags = 0;
/ / Sử dụng kích thước tự động.
swapChainDesc.Width = 0;
swapChainDesc.Height = 0;
/ / Đây là định dạng chuỗi trao đổi phổ biến nhất.
swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
/ / Không sử dụng nhiều mẫu.
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;
/ / Sử dụng hai bộ đệm cho phép hiệu ứng lật.
swapChainDesc.BufferCount = 2;
/ / Chúng tôi khuyên bạn nên sử dụng hiệu ứng trao đổi này cho tất cả các ứng dụng.
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
/ / Một khi mô tả chuỗi trao đổi được cấu hình, nó phải được
/ / 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) );
/ / Đả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
)
);
1.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).
/ / 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

/ / toàn bộ cửa sổ.
D3D11_TEXTURE2D_DESC backBufferDesc = {0};
backBuffer-> GetDesc (& backBufferDesc);
D3D11_VIEWPORT khung nhìn;
viewport.TopLeftX = 0.0f;
viewport.TopLeftY = 0.0f;
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);
1.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ổ.
/ / 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) );
}
1.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ộ đệm
chuỗ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
thay đổi kích cỡ.
Để thay đổi kích thước bộ đếm chuỗi trao đổi ta dùng IDXGISwapChain::
ResizeBuffers.
/ / Nếu chuỗi trao đổi đã tồn tại, thay đổi kích thước.
DX :: ThrowIfFailed (
m_swapChain-> ResizeBuffers (
2,
0,
0,
DXGI_FORMAT_B8G8R8A8_UNORM,
0
)
);
1.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 trườ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.

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.

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.

×