#include <d3d9.h>
#include <d3dx9.h>#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")#define WINDOW_WIDTH    640
#define WINDOW_HEIGHT   480PDIRECT3D9 g_D3D = nullptr; // D3D对象
PDIRECT3DDEVICE9 g_D3DDevice = nullptr; // D3D设备对象
D3DXMATRIX g_ortho; // 矩阵变量,用于正交投影变换bool InitializeD3D(HWND hWnd); // 初始化D3D
void ShutdownD3D(); // 退出窗口之前释放D3D对象和D3D设备对象
void RenderScene(); // 渲染场景
bool InitializeObjects();// 初始化3D图形对象// 顶点数据
struct stD3DVertex
{float x, y, z; // 坐标值(屏幕坐标) (左手坐标系) rhw 标志unsigned long color; // 漫射光颜色
};
// 顶点缓存
PDIRECT3DVERTEXBUFFER9 g_VertexBuffer = nullptr;// 顶点格式
#define D3DFVF_VERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); // 窗口消息处理过程
void MyCreateWindow(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd); // 创建窗口/************************************************************************/
/* Windows窗口程序入口函数                                               */
/************************************************************************/
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{MyCreateWindow(hInstance, hPrevInstance, lpCmdLine, nShowCmd);return 0;
}/************************************************************************/
/* 创建窗口                                                                 */
/************************************************************************/
void MyCreateWindow(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{// 声明一个窗口类 包含创建一个窗口所需要的相关数据信息WNDCLASSEX wc = {sizeof(WNDCLASSEX), // 窗口类的内存空间大小(字节)CS_CLASSDC, // 窗口风格MsgProc, // 处理消息的函数指针0, // 类额外信息0, // 窗口额外信息hInstance, // 句柄,可以看作是窗口的身份标识nullptr, // 图标样式nullptr, // 鼠标样式nullptr, // 背景画刷 也可以设置为一个颜色值 调用UnregisterClass后由系统删除nullptr, // 菜单"AppClass", // 窗口类名 nullptr // 窗口小图标};// 注册窗口类RegisterClassEx(&wc);// 创建窗口HWND hWnd = CreateWindow("AppClass", // 窗口类名"Window Title", // 窗口标题WS_OVERLAPPEDWINDOW, // 窗口风格 (可重叠)100, // 窗口左上角在屏幕坐标中的X值100, // 窗口左上角在屏幕坐标中的Y值WINDOW_WIDTH, // 窗口宽度WINDOW_HEIGHT, // 窗口高度GetDesktopWindow(), // 窗口父类nullptr, // 菜单hInstance, // 句柄nullptr);if (InitializeD3D(hWnd)){// 设置指定窗口为显示状态ShowWindow(hWnd, SW_SHOWDEFAULT);// 发送绘制消息给窗口UpdateWindow(hWnd);MSG msg;ZeroMemory(&msg, sizeof(msg));while (msg.message != WM_QUIT){if (PeekMessage(&msg, // 存储消息的结构体指针nullptr, // 窗口消息和线程消息都会被处理 0, // 消息过滤最小值; 为0时返回所有可用信息0, // 消息过滤最大值; 为0时返回所有可用信息PM_REMOVE // 指定消息如何处理; 消息在处理完后从队列中移除)){TranslateMessage(&msg); // 变换虚拟键消息到字符消息,字符消息被发送到调用线程的消息队列DispatchMessage(&msg); // 派发消息到窗口过程}else{// 渲染场景RenderScene();}}}// 释放D3D对象和D3D设备对象资源ShutdownD3D();// 注销窗口类,释放窗口所占用资源UnregisterClass("AppClass", wc.hInstance);
}/************************************************************************/
/* 窗口消息处理过程                                                                     */
/************************************************************************/
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{switch (msg){case WM_DESTROY:PostQuitMessage(0);return 0;break;default:break;}// windows消息的默认处理函数return DefWindowProc(hWnd, msg, wParam, lParam);
}/************************************************************************/
/* 初始化D3D对象和D3D设备对象*/
/************************************************************************/
bool InitializeD3D(HWND hWnd)
{// 显示模式 (以像素为单位的屏幕宽高,刷新频率,surface formt)D3DDISPLAYMODE displayMode;// 创建D3D对象 获取主显卡硬件信息  最先被创建,最后被释放g_D3D = Direct3DCreate9(D3D_SDK_VERSION);if (g_D3D == nullptr){return false;}// 获取显示模式if (FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT/*查询主显卡*/, &displayMode))){return false;}// D3D 显示参数D3DPRESENT_PARAMETERS d3dpp;ZeroMemory(&d3dpp, sizeof(d3dpp));d3dpp.Windowed = true; // 是否窗口化d3dpp.BackBufferFormat = displayMode.Format;  // D3DFMT_X8R8G8B8  表示为32位RGB像素格式 每种颜色用一个字节表示d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 帧缓冲区交换方式; 可能是COPY可能是FLIP,由设备来确定适合当前情况的方式// 创建D3D设备对象 ---- 代表显卡if (FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice))){return false;}// 初始化图形对象需要的顶点数据if (!InitializeObjects()){return false;}return true;
}/************************************************************************/
/* 释放D3D对象及设备对象资源*/
/************************************************************************/
void ShutdownD3D()
{if (g_D3DDevice != nullptr){g_D3DDevice->Release(); // 释放设备对象g_D3DDevice = nullptr;}if (g_VertexBuffer != nullptr){g_VertexBuffer->Release(); // 释放顶点缓存g_VertexBuffer = nullptr;}if (g_D3D != nullptr){g_D3D->Release(); // 最行创建, 最后释放g_D3D = nullptr;}}/************************************************************************/
/* 渲染场景                                                             */
/************************************************************************/
void RenderScene()
{g_D3DDevice->Clear(0, nullptr, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);g_D3DDevice->BeginScene();// 通知D3D设备对象数据源g_D3DDevice->SetStreamSource(0,g_VertexBuffer, // 数据源地址0, // 顶点缓存起始偏移sizeof(stD3DVertex) // 每个顶点数据的大小);g_D3DDevice->SetFVF(D3DFVF_VERTEX);// 绘制图元g_D3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,  // 图元类型; 三角形0, // 要加载的第一个顶点的索引1 // 图元数量, 由图元类型决定(一个三角形));g_D3DDevice->EndScene();// 显示backbuffer内容到屏幕g_D3DDevice->Present(nullptr, nullptr, nullptr, nullptr);
}/************************************************************************/
/* 初始化顶点数据                                                        */
/************************************************************************/
bool InitializeObjects()
{// 计算正交投影矩阵 左手坐标系D3DXMatrixOrthoLH(&g_ortho,WINDOW_WIDTH,WINDOW_HEIGHT,0.1f, // 近裁剪面1000.f // 远裁剪面);// 设置投影变换g_D3DDevice->SetTransform(D3DTS_PROJECTION, // 标识为投影变换&g_ortho // 变幻矩阵);// 设置光照g_D3DDevice->SetRenderState(D3DRS_LIGHTING, // 渲染状态类型; 光照FALSE // 不使用光照);// 裁剪 (背面剔除)g_D3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE // 不进行背面剔除);// 三角形顶点数据stD3DVertex objData[] = {{-150.f, -150.f, 0.1f, D3DCOLOR_XRGB(255, 255, 0)}, // 本地坐标系,也称模型坐标{150.f, -150.f, 0.1f, D3DCOLOR_XRGB(255, 0, 0)},{0.f, 150.f, 0.1f, D3DCOLOR_XRGB(0, 0, 255)}};// 创建顶点缓存if (FAILED(g_D3DDevice->CreateVertexBuffer(sizeof(objData), // 顶点缓冲区的大小0, // 顶点缓存的处理取决于D3D设备和顶点缓冲区是如何创建的(硬处理 or 软处理) 创建的设备对象为 D3DCREATE_HARDWARE_VERTEXPROCESSING 则此值必须为0D3DFVF_VERTEX, // 顶点格式D3DPOOL_DEFAULT, // 默认使用显卡显存&g_VertexBuffer, // 顶点缓存指针nullptr // 保留值, 适用于Vista以上系统中资源分享))){return false;}void* ptr = nullptr; // 顶点缓存地址// 在显存中获取一块显存空间用于存储顶点数据if (FAILED(g_VertexBuffer->Lock(0, // 全部缓存sizeof(objData), // 顶点数据大小(void**)&ptr, // 将顶点数据首地址返回给ptr指针0 // 锁定标记))){return false;}// 将顶数数据复制到顶点缓存里(显存)memcpy(ptr, objData, sizeof(objData));g_VertexBuffer->Unlock(); // 解锁顶点缓存return true;
}

DirectX 画三角形 正交投影相关推荐

  1. DirectX 画三角形 透视投影

    #include <d3d9.h> #include <d3dx9.h>#pragma comment(lib, "d3d9.lib") #pragma c ...

  2. 图形学基础:第4章 画三角形

    第4章: 画三角形 三角形是最基本的图元之一,正方形由两个三角形构成,所有的多边形都能够分割成若干三角形(曲边可通过无限细分模拟),事实上在OpenGL和DirectX中,所有的形状都是通过绘制三角形 ...

  3. 用border画三角形

    <html> <head> <title>用border画三角形</title> <style>#one{width:0px;height: ...

  4. html5 css 三角形,css怎么画三角形?

    css怎么画三角形?下面本篇文章就来给大家介绍一下使用CSS画三角形的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. css怎么画三角形? 三角形实现原理:宽度width为0: ...

  5. splitpane如何设置竖条的宽度_如何用 CSS 画三角形和箭头

    三角形和箭头这两个图标在网页中经常会用到,例如:下拉选择框.排序.返回到上一页.导航条,分页都会用到三角形或者箭头,当然是用图片的方式的确可以实现这一样式,但是是用图片如果调整颜色那就比较困难了,除非 ...

  6. python编程怎么画三角形的外接圆_用MATLAB画三角形外接圆

    用 MATLAB 画三角形的外接圆 clear all ;close all ; clc; %1. 画三角形 : 随机产生三个顶点坐标,将各顶点连接. a=[x1,y1;x2,y2;x3,y3] a= ...

  7. 前端怎么画三角形_css如何画三角形?

    我们在平时的前端开发的时候,有时候是需要一些小图形来丰富一下页面效果,比如:下拉列表的倒三角图形.那么这样的一个三角形是如何制作出来的.下面本篇文章就来给大家介绍一下使用css如何画三角形的方法,希望 ...

  8. canvas画三角形

    万丈高楼平地起,从零开始,使用 canavas 画三角形 <!DOCTYPE html> <html lang="en"> <head>< ...

  9. Turtle 画方形 画圆 画三角形

    Turtle 画方形 画圆 画三角形 参考文档https://docs.python.org/3/library/turtle.html?highlight=turtle%20circle#turtl ...

最新文章

  1. Widgets 整理
  2. WinAPI: 钩子回调函数之 SysMsgFilterProc
  3. ACMNO.42 C语言-第几天 定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。利用结构体的在最下面
  4. python布尔测试对象_面试题十九期-测试开发面试题之python系列-这个中~
  5. 关于滑动条滚动 scroll兼容
  6. s4-4 以太网概述
  7. jeecg输入中文查询导表为空_简单查询
  8. 底大一级压死人!华为Mate 30 Pro主摄CMOS或将达到1/1.5英寸
  9. HttpRunnerManager(一)--安装
  10. Apple Watch,其实是个老司“机”
  11. python读取bmp文件,go 读取BMP文件头二进制读取方式
  12. golang对接paypal支付
  13. [图形学]OpenGL实现斯坦福兔子(Stanford Bunny)实验代码
  14. html的外部调用函数,如何在HTML中调用外部JavaScript函数
  15. 支付宝api全(支付宝支付(app,h5,js),支付宝订单查询,支付宝退款,支付宝交易退款查询,支付宝提现,支付宝提现查询)
  16. Renesas:配置中断的常规流程
  17. mountain乐谱-蒲公英的约定
  18. VSPD虚拟串口软件的一些使用说明
  19. ebc是什么意思_亚马逊EBC是什么有什么用,该如何操作?
  20. oracle在表上创建分区,Oracle分区表 (Partition Table) 的创建及管理

热门文章

  1. 律师所小程序开发 律师小程序开发定制 律所小程序源码定制
  2. mysql用18位存储uuid_Mysql 存储 UUID
  3. 关于Python自动化的就业真相
  4. PhpStorm破解版及使用教程
  5. 2019蓝桥杯B组省赛 J.灵能传输
  6. python排序每200个一组不同身份证
  7. Git的安装配置超详细版本(全)
  8. 用函数分别打印一条横线,多行
  9. (一)JQuery动态加载js的三种方法
  10. SFTP在Linux和window下的文件传输