D3D 基础彩色矩形的绘制
来源:互联网 发布:focusky官方中文版mac 编辑:程序博客网 时间:2024/05/19 19:57
#include <Windows.h>
#include <D3D9.h>
#pragma comment(lib, "D3D9.lib")
const TCHAR *kClassName = "Rectangle_D3D";
IDirect3D9 *d3d9 = nullptr;
IDirect3DDevice9 *device9 = nullptr;
IDirect3DVertexBuffer9 *vectex_buffer9 = nullptr;
D3DPRESENT_PARAMETERS params;
D3DPRESENT_PARAMETERS *p;
BOOL window_mode = TRUE;
#define D3D_FVF_VECTOR (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
const int kWndWidth = 640;
const int kWndHeight = 480;
struct Vector {
Vector(float v_x, float v_y, float v_z, DWORD c) : x(v_x), y(v_y), z(v_z), color(c) {
rhw = 1.0f;
}
float x, y, z, rhw;
DWORD color;
};
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
bool InitD3D(HWND hwnd);//初始化
bool Done();//完成
bool ReDrawRectangle();
int CALLBACK WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
) {
//init app
WNDCLASSEX wndclassex;
wndclassex.cbSize = sizeof(WNDCLASSEX);
wndclassex.style = CS_HREDRAW | CS_VREDRAW;
wndclassex.lpfnWndProc = WindowProc;
wndclassex.cbClsExtra = 0;
wndclassex.cbWndExtra = 0;
wndclassex.hInstance = hInstance;
wndclassex.hIcon = nullptr;
wndclassex.hCursor = LoadCursor(hInstance, IDC_ARROW);
wndclassex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndclassex.lpszMenuName = nullptr;
wndclassex.lpszClassName = kClassName;
wndclassex.hIconSm = nullptr;
RegisterClassEx(&wndclassex);
HWND hwnd = CreateWindowEx(0, kClassName, "主宰", WS_OVERLAPPEDWINDOW, 100, 100, 640, 480, nullptr, nullptr, hInstance, nullptr);
ShowWindow(hwnd, nCmdShow);
InitD3D(hwnd);
UpdateWindow(hwnd);
MSG msg;
while (true) {
if (PeekMessage(&msg,nullptr, 0, 0, PM_REMOVE)) {
if (msg.message == WM_QUIT) {
break;
}
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
Done();
return 0;
}
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
) {
PAINTSTRUCT ps;
HDC hdc;
if (uMsg == WM_PAINT) {
hdc = BeginPaint(hwnd, &ps);
ReDrawRectangle();
EndPaint(hwnd, &ps);
} else if (uMsg == WM_KEYDOWN) {
if (wParam == VK_SPACE) {
//空格键
//全屏模式<-->窗口模式之间切换
window_mode = !window_mode;
D3DDISPLAYMODE mode;
if (!window_mode) {
UINT adapter_mode_count = d3d9->GetAdapterModeCount(D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8);
for (UINT adapter_mode = 0; adapter_mode < adapter_mode_count; ++adapter_mode) {
d3d9->EnumAdapterModes(D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8, adapter_mode, &mode);
if (mode.Width == kWndWidth && mode.Height == kWndHeight) {
break;
}
}
}
if (!window_mode && (mode.Width != kWndWidth || mode.Height != kWndHeight)) {
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
if (nullptr != device9) {
params.BackBufferWidth = window_mode ? kWndWidth : mode.Width;
params.BackBufferHeight = window_mode ? kWndHeight : mode.Height;
params.Windowed = window_mode;
HRESULT hr = device9->Reset(p);
if (FAILED(hr)) {
int i = 0;
}
}
}
}else if (uMsg == WM_DESTROY) {
PostMessage(hwnd, WM_QUIT, 0, 0);
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
bool InitD3D(HWND hwnd) {
d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
if (nullptr == d3d9) {
return false;
}
params.BackBufferWidth = kWndWidth;
params.BackBufferHeight = kWndHeight;
params.BackBufferFormat = D3DFMT_X8R8G8B8;
params.BackBufferCount = 1;
params.MultiSampleType = D3DMULTISAMPLE_NONE;
params.MultiSampleQuality = 0;
params.SwapEffect = D3DSWAPEFFECT_COPY;
params.hDeviceWindow = hwnd;
params.Windowed = window_mode;
params.EnableAutoDepthStencil = FALSE;
params.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
params.Flags = 0;
params.FullScreen_RefreshRateInHz = 0;
params.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
HRESULT hr = d3d9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, p, &device9);
if (FAILED(hr)) {
return false;
}
device9->SetRenderState(D3DRS_LIGHTING, false);
hr = device9->CreateVertexBuffer(6 * sizeof(Vector), 0, D3D_FVF_VECTOR, D3DPOOL_SYSTEMMEM, &vectex_buffer9, nullptr);
if (FAILED(hr)) {
return false;
}
Vector *vectors;
vectex_buffer9->Lock(0, 0, (void**)&vectors, 0);
//创建Rectangle
vectors[0] = Vector(220, 340, 0, 0xffff0000);
vectors[1] = Vector(220, 140, 0, 0xffff0000);
vectors[2] = Vector(420, 140, 0, 0xffff0000);
vectors[3] = Vector(220, 340, 0, 0xffff0000);
vectors[4] = Vector(420, 140, 0, 0xffff0000);
vectors[5] = Vector(420, 340, 0, 0xffff0000);
vectex_buffer9->Unlock();
return true;
}
bool ReDrawRectangle() {
if (nullptr == device9) {
return false;
}
device9->Clear(0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 0, 0, 0), 0.0f, 0);
device9->SetStreamSource(0, vectex_buffer9, 0, sizeof(Vector));
device9->SetFVF(D3D_FVF_VECTOR);
device9->BeginScene();
device9->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
device9->EndScene();
device9->Present(0, 0, 0, 0);
return true;
}
bool Done() {
if (nullptr != vectex_buffer9) {
vectex_buffer9->Release();
}
if (nullptr != device9) {
device9->Release();
}
if (nullptr != d3d9) {
d3d9->Release();
}
return true;
}
#include <D3D9.h>
#pragma comment(lib, "D3D9.lib")
const TCHAR *kClassName = "Rectangle_D3D";
IDirect3D9 *d3d9 = nullptr;
IDirect3DDevice9 *device9 = nullptr;
IDirect3DVertexBuffer9 *vectex_buffer9 = nullptr;
D3DPRESENT_PARAMETERS params;
D3DPRESENT_PARAMETERS *p;
BOOL window_mode = TRUE;
#define D3D_FVF_VECTOR (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
const int kWndWidth = 640;
const int kWndHeight = 480;
struct Vector {
Vector(float v_x, float v_y, float v_z, DWORD c) : x(v_x), y(v_y), z(v_z), color(c) {
rhw = 1.0f;
}
float x, y, z, rhw;
DWORD color;
};
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
bool InitD3D(HWND hwnd);//初始化
bool Done();//完成
bool ReDrawRectangle();
int CALLBACK WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
) {
//init app
WNDCLASSEX wndclassex;
wndclassex.cbSize = sizeof(WNDCLASSEX);
wndclassex.style = CS_HREDRAW | CS_VREDRAW;
wndclassex.lpfnWndProc = WindowProc;
wndclassex.cbClsExtra = 0;
wndclassex.cbWndExtra = 0;
wndclassex.hInstance = hInstance;
wndclassex.hIcon = nullptr;
wndclassex.hCursor = LoadCursor(hInstance, IDC_ARROW);
wndclassex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndclassex.lpszMenuName = nullptr;
wndclassex.lpszClassName = kClassName;
wndclassex.hIconSm = nullptr;
RegisterClassEx(&wndclassex);
HWND hwnd = CreateWindowEx(0, kClassName, "主宰", WS_OVERLAPPEDWINDOW, 100, 100, 640, 480, nullptr, nullptr, hInstance, nullptr);
ShowWindow(hwnd, nCmdShow);
InitD3D(hwnd);
UpdateWindow(hwnd);
MSG msg;
while (true) {
if (PeekMessage(&msg,nullptr, 0, 0, PM_REMOVE)) {
if (msg.message == WM_QUIT) {
break;
}
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
Done();
return 0;
}
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
) {
PAINTSTRUCT ps;
HDC hdc;
if (uMsg == WM_PAINT) {
hdc = BeginPaint(hwnd, &ps);
ReDrawRectangle();
EndPaint(hwnd, &ps);
} else if (uMsg == WM_KEYDOWN) {
if (wParam == VK_SPACE) {
//空格键
//全屏模式<-->窗口模式之间切换
window_mode = !window_mode;
D3DDISPLAYMODE mode;
if (!window_mode) {
UINT adapter_mode_count = d3d9->GetAdapterModeCount(D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8);
for (UINT adapter_mode = 0; adapter_mode < adapter_mode_count; ++adapter_mode) {
d3d9->EnumAdapterModes(D3DADAPTER_DEFAULT, D3DFMT_X8R8G8B8, adapter_mode, &mode);
if (mode.Width == kWndWidth && mode.Height == kWndHeight) {
break;
}
}
}
if (!window_mode && (mode.Width != kWndWidth || mode.Height != kWndHeight)) {
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
if (nullptr != device9) {
params.BackBufferWidth = window_mode ? kWndWidth : mode.Width;
params.BackBufferHeight = window_mode ? kWndHeight : mode.Height;
params.Windowed = window_mode;
HRESULT hr = device9->Reset(p);
if (FAILED(hr)) {
int i = 0;
}
}
}
}else if (uMsg == WM_DESTROY) {
PostMessage(hwnd, WM_QUIT, 0, 0);
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
bool InitD3D(HWND hwnd) {
d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
if (nullptr == d3d9) {
return false;
}
params.BackBufferWidth = kWndWidth;
params.BackBufferHeight = kWndHeight;
params.BackBufferFormat = D3DFMT_X8R8G8B8;
params.BackBufferCount = 1;
params.MultiSampleType = D3DMULTISAMPLE_NONE;
params.MultiSampleQuality = 0;
params.SwapEffect = D3DSWAPEFFECT_COPY;
params.hDeviceWindow = hwnd;
params.Windowed = window_mode;
params.EnableAutoDepthStencil = FALSE;
params.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
params.Flags = 0;
params.FullScreen_RefreshRateInHz = 0;
params.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
HRESULT hr = d3d9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, p, &device9);
if (FAILED(hr)) {
return false;
}
device9->SetRenderState(D3DRS_LIGHTING, false);
hr = device9->CreateVertexBuffer(6 * sizeof(Vector), 0, D3D_FVF_VECTOR, D3DPOOL_SYSTEMMEM, &vectex_buffer9, nullptr);
if (FAILED(hr)) {
return false;
}
Vector *vectors;
vectex_buffer9->Lock(0, 0, (void**)&vectors, 0);
//创建Rectangle
vectors[0] = Vector(220, 340, 0, 0xffff0000);
vectors[1] = Vector(220, 140, 0, 0xffff0000);
vectors[2] = Vector(420, 140, 0, 0xffff0000);
vectors[3] = Vector(220, 340, 0, 0xffff0000);
vectors[4] = Vector(420, 140, 0, 0xffff0000);
vectors[5] = Vector(420, 340, 0, 0xffff0000);
vectex_buffer9->Unlock();
return true;
}
bool ReDrawRectangle() {
if (nullptr == device9) {
return false;
}
device9->Clear(0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 0, 0, 0), 0.0f, 0);
device9->SetStreamSource(0, vectex_buffer9, 0, sizeof(Vector));
device9->SetFVF(D3D_FVF_VECTOR);
device9->BeginScene();
device9->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
device9->EndScene();
device9->Present(0, 0, 0, 0);
return true;
}
bool Done() {
if (nullptr != vectex_buffer9) {
vectex_buffer9->Release();
}
if (nullptr != device9) {
device9->Release();
}
if (nullptr != d3d9) {
d3d9->Release();
}
return true;
}
阅读全文
0 0
- D3D 基础彩色矩形的绘制
- D3D绘制彩色立方体
- D3D的绘制
- D3D基础之绘制状态
- D3D的绘制函数总结
- OpenGL ES零基础入门四矩形的绘制
- 绘制简单的矩形
- 彩色图像的直方图绘制
- D3D绘制顶点的必要步骤
- D3D绘制操作的必要步骤
- D3D基本三角形面的绘制
- D3D中基本立体面的绘制
- D3D中2D图片的绘制
- D3D中2D图片的绘制
- d3d绘制纹理时模糊不清的原因
- D3D中2D图片的绘制
- 整理 qt opengl,自己的基础框架 —— 绘制一个彩色三角形
- 整理 qt opengl,自己的基础框架 —— 绘制一个彩色三角形
- UVA-12563 01背包
- canvas元素
- windows10 里 SQL 乱码问题解决方案
- iOS和macOS体验合一?苹果还得解决这些
- phpstorm 配置Xdebug进行调试PHP教程
- D3D 基础彩色矩形的绘制
- 使用web.xml方式加载Spring时,获取Spring context的两种方式
- Navicat 连不上mysql数据库 问题及解决法
- 关于g++(gcc)编译c/c++的学习笔记
- SpringMVC
- redis设计与实现(二)链表
- 使用comparator 将对象数组进行排序
- Catalan number(POJ:2084)
- 装饰者模式的简单实现