环境配置以及背景知识

环境
Windows 8.1 64bit
VS2013
Microsoft DirectX SDK (June 2010)
NVDIA Geforce GT755

环境的配置參考VS2008整合DirectX9.0开发环境


一些背景知识 

DirectX的和应用层与硬件层的关系例如以下

REF设备同意开发者測试那些Direct3D提供了但未被图形设备所实现的功能。

COM(Component Object Model)是一项可使DirectX独立于编程语言,并具备向下兼容的技术。基本思想是将大而复杂的应用软件分为一系列的可现行实现,易于开发,理解复用和调整的软件单元。

COM组件是遵循COM规范编写,以Win32动态链接库(dll)或者可执行文件形式公布的可执行二进制代码(exe)。

COM的长处:

  • 与开发语言无关
  • 通过接口有效保证了组件的复用性
  • 组件执行效率高。便于使用和管理

以下能够正式開始今天的学习了。

绘制一个三角形

用到的DxUtility类在VS2008整合DirectX9.0开发环境已经实现了。能够直接去看。主要改动一下渲染的几个函数。

#include "dxutility.h"
#include <windows.h>
#include <iostream> //
// Globals
// IDirect3DDevice9* Device = 0;
D3DXMATRIX World;
IDirect3DVertexBuffer9 * VB = 0; const int Width = 800;
const int Height = 600; struct Vertex{
Vertex(){};
Vertex(float _x, float _y, float _z)
{
x = _x;
y = _y;
z = _z;
} float x, y, z;
static const DWORD FVF;
}; const DWORD Vertex::FVF = D3DFVF_XYZ; //
// Framework Functions
// bool Setup()
{
Device->CreateVertexBuffer(
3 * sizeof(Vertex),
D3DUSAGE_WRITEONLY,
Vertex::FVF,
D3DPOOL_MANAGED,
&VB,
0); Vertex* vertices;
VB->Lock(0, 0, (void**)&vertices, 0); vertices[0] = Vertex(-1.0f, 0.0f, 2.0f);
vertices[1] = Vertex(0.0f, 1.0f, 2.0f);
vertices[2] = Vertex(1.0f, 0.0f, 2.0f); VB->Unlock(); D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(
&proj, // result
D3DX_PI * 0.5f, // 90 - degrees
(float)Width / (float)Height, // aspect ratio
1.0f, // near plane
1000.0f); // far plane
Device->SetTransform(D3DTS_PROJECTION, &proj); Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); return true;
} void Cleanup()
{
Dx::Release<IDirect3DVertexBuffer9*>(VB);
} bool Display(float timeDelta)
{
if (Device) // Only use Device methods if we have a valid device.
{
Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
Device->BeginScene(); Device->SetStreamSource(0, VB, 0, sizeof(Vertex));
Device->SetFVF(Vertex::FVF); // Draw one triangle.
Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); Device->EndScene();
Device->Present(0, 0, 0, 0);
} return true;
} //
// WndProc
//
LRESULT CALLBACK Dx::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
::PostQuitMessage(0);
break; case WM_KEYDOWN:
if (wParam == VK_ESCAPE)
::DestroyWindow(hwnd);
break;
}
return ::DefWindowProc(hwnd, msg, wParam, lParam);
} //
// WinMain
//
int WINAPI WinMain(HINSTANCE hinstance,
HINSTANCE prevInstance,
PSTR cmdLine,
int showCmd)
{
if (!Dx::InitDx(hinstance,
Width, Height, true, D3DDEVTYPE_HAL, &Device))
{
::MessageBox(0, "InitD3D() - FAILED", 0, 0);
return 0;
} if (!Setup())
{
::MessageBox(0, "Setup() - FAILED", 0, 0);
return 0;
}
Dx::EnterMsgLoop(Display); Cleanup(); Device->Release(); return 0;
}

终于效果 


给三角形加上颜色
数据结构定义

struct ColorVertex{
ColorVertex(float _x, float _y, float _z, D3DCOLOR c)
{
x = _x;
y = _y;
z = _z;
color = c;
}
float x, y, z;
D3DCOLOR color;
static const DWORD FVF;
};
const DWORD ColorVertex::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;

创建Buffer

    Device->CreateVertexBuffer(
3 * sizeof(ColorVertex),
D3DUSAGE_WRITEONLY,
ColorVertex::FVF,
D3DPOOL_MANAGED,
&VB,
0); ColorVertex *v;
VB->Lock(0, 0, (void**)&v, 0);
v[0] = ColorVertex(-1.0f, 0.0f, 2.0f, D3DCOLOR_XRGB(255, 0, 0));
v[1] = ColorVertex(0.0f, 1.0f, 2.0f, D3DCOLOR_XRGB(0, 255, 0));
v[2] = ColorVertex(1.0f, 0.0f, 2.0f, D3DCOLOR_XRGB(0, 0, 255)); VB->Unlock();

在绘制函数中设置使用Ground插值进行三角形绘制

bool Display(float timeDelta)
{
if (Device) // Only use Device methods if we have a valid device.
{
std::cout << "Display" << std::endl;
Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
Device->BeginScene(); Device->SetStreamSource(0, VB, 0, sizeof(ColorVertex));
Device->SetFVF(ColorVertex::FVF); Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); Device->EndScene();
Device->Present(0, 0, 0, 0);
} return true;
}

渲染结果


绘制一个旋转的正方体

生成Vertex Buffer和Index Buffer

   Device->CreateVertexBuffer(
8 * sizeof(ColorVertex),
D3DUSAGE_WRITEONLY,
ColorVertex::FVF,
D3DPOOL_MANAGED,
&VB,
0);
Device->CreateIndexBuffer(
36 * sizeof(WORD),
D3DUSAGE_WRITEONLY,
D3DFMT_INDEX16,
D3DPOOL_MANAGED,
&IB,
0); ColorVertex *v;
VB->Lock(0, 0, (void**)&v, 0);
v[0] = ColorVertex(-1.0f, -1.0f, -1.0f, D3DCOLOR_XRGB(255, 0, 0));
v[1] = ColorVertex(-1.0f, 1.0f, -1.0f, D3DCOLOR_XRGB(0, 255, 0));
v[2] = ColorVertex(1.0f, 1.0f, -1.0f, D3DCOLOR_XRGB(0, 0, 255));
v[3] = ColorVertex(1.0f, -1.0f, -1.0f, D3DCOLOR_XRGB(255, 255, 0));
v[4] = ColorVertex(-1.0f, -1.0f, 1.0f, D3DCOLOR_XRGB(0, 255, 0));
v[5] = ColorVertex(-1.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(0, 0, 255));
v[6] = ColorVertex(1.0f, 1.0f, 1.0f, D3DCOLOR_XRGB(255, 0, 255));
v[7] = ColorVertex(1.0f, -1.0f, 1.0f, D3DCOLOR_XRGB(0, 255, 0)); VB->Unlock(); WORD* indices = 0;
IB->Lock(0, 0, (void**)&indices, 0);
// front side
indices[0] = 0; indices[1] = 1; indices[2] = 2;
indices[3] = 0; indices[4] = 2; indices[5] = 3; // back side
indices[6] = 4; indices[7] = 6; indices[8] = 5;
indices[9] = 4; indices[10] = 7; indices[11] = 6; // left side
indices[12] = 4; indices[13] = 5; indices[14] = 1;
indices[15] = 4; indices[16] = 1; indices[17] = 0; // right side
indices[18] = 3; indices[19] = 2; indices[20] = 6;
indices[21] = 3; indices[22] = 6; indices[23] = 7; // top
indices[24] = 1; indices[25] = 5; indices[26] = 6;
indices[27] = 1; indices[28] = 6; indices[29] = 2; // bottom
indices[30] = 4; indices[31] = 0; indices[32] = 3;
indices[33] = 4; indices[34] = 3; indices[35] = 7; IB->Unlock();

绘制函数。让正方体旋转起来

       // spin the cube:
//
D3DXMATRIX Rx, Ry; // rotate 45 degrees on x-axis
D3DXMatrixRotationX(&Rx, 3.14f / 4.0f); // incremement y-rotation angle each frame
static float y = 0.0f;
D3DXMatrixRotationY(&Ry, y);
y += timeDelta; // reset angle to zero when angle reaches 2*PI
if (y >= 6.28f)
y = 0.0f; // combine x- and y-axis rotation transformations.
D3DXMATRIX p = Rx * Ry; Device->SetTransform(D3DTS_WORLD, &p); Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
Device->BeginScene(); Device->SetStreamSource(0, VB, 0, sizeof(ColorVertex));
Device->SetIndices(IB);
Device->SetFVF(ColorVertex::FVF); Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12); Device->EndScene();
Device->Present(0, 0, 0, 0);

在屏幕上显示FPS信息
首先初始化文字

    D3DXFONT_DESC d3dFont;

    memset(&d3dFont, 0, sizeof(d3dFont));
d3dFont.Height = 25; // in logical units
d3dFont.Width = 12; // in logical units
d3dFont.Weight = 500;// boldness, range 0(light) - 1000(bold)
d3dFont.Italic = FALSE;
d3dFont.CharSet = DEFAULT_CHARSET;
strcpy_s(d3dFont.FaceName, "Times New Roman");
if (FAILED(D3DXCreateFontIndirect(Device, &d3dFont, &font)))
{
::MessageBox(0, "D3DXCreateFontIndirect() - FAILED", 0, 0);
::PostQuitMessage(0);
}

声明几个变量

ID3DXFont* font = 0;
DWORD FrameCnt = 0;
float TimeElapsed = 0;
float FPS = 0;
char FPSString[16];

FPS的计算 

FrameCnt++;
TimeElapsed += timeDelta;
if (TimeElapsed >= 1.0f)
{
FPS = (float)FrameCnt / TimeElapsed;
sprintf_s(FPSString, "FPS:%f", FPS);
FPSString[15] = '\0'; // mark end of string
TimeElapsed = 0.0f;
FrameCnt = 0;
}

文字的渲染

Device->BeginScene();
RECT rect = { 0, 0, Width, Height };
font->DrawText(
m_pSprite,
FPSString,
-1, // size of string or -1 indicates null terminating string
&rect, // rectangle text is to be formatted to in windows coords
DT_TOP | DT_LEFT, // draw in the top left corner of the viewport
0xff000000); // black text Device->EndScene();

记住最后要Clear掉COM对象

void Cleanup()
{
Dx::Release<IDirect3DVertexBuffer9*>(VB);
Dx::Release<IDirect3DIndexBuffer9*>(IB);
Dx::Release<ID3DXFont*>(font);
}

执行结果

參考

Introduction to 3D Game Programming with DirectX® 9.0

两天学会DirectX 3D之入门的更多相关文章

  1. 两天学会DirectX 3D之第二天

    提要 前几天非常easy地跑了一个DirectX 9 程序,以为DirectX就那么绘制,事实证明有点Naive了. 之前的那个程序最多也就是个固定流水线的东西. 可是今天要用DirectX11来写一 ...

  2. 转 猫都能学会的Unity3D Shader入门指南(二)

    猫都能学会的Unity3D Shader入门指南(二) 关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己 ...

  3. 从零3D基础入门XNA 4.0(2)——模型和BasicEffect

    [题外话] 上一篇文章介绍了3D开发基础与XNA开发程序的整体结构,以及使用Model类的Draw方法将模型绘制到屏幕上.本文接着上一篇文章继续,介绍XNA中模型的结构.BasicEffect的使用以 ...

  4. 从零3D基础入门XNA 4.0(1)——3D开发基础

    [题外话] 最近要做一个3D动画演示的程序,由于比较熟悉C#语言,再加上XNA对模型的支持比较好,故选择了XNA平台.不过从网上找到很多XNA的入门文章,发现大都需要一些3D基础,而我之前并没有接触过 ...

  5. 两周“学会”bootstrap搭建一个移动站点

    一直想着用bootstrap搭建网站,它的自适应.元素封装完善.现成的Glyphicons字体图标,省去很多的css.js.ui的工作,可以快速搭建一个客户需要的站点.ytkah自己有一些div+cs ...

  6. 【公众号系列】两分钟学会SAP F1技巧

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]两分钟学会SAP F1技巧   写 ...

  7. xml入门简介--两天学会xml

    前言 在很久以前,笔者曾见到过1000+页的xml书,里面还有n多的概念,XSL,Xquery,让人头痛.无奈最近需要用到,所以在w3c恶补了一下.以下大致整理了一下相关概念,但是对XSL等派生语言没 ...

  8. DirectX 3D 之C#开发

    C#下进行directX的3D开发,一个旋转的4棱锥的例子. 建议看两个文档<Managed DirectX 9图形和游戏编程简略中文文档>和<Managed DirectX 9 S ...

  9. (转载)猫都能学会的Unity3D Shader入门指南(一)

    原文地址 http://onevcat.com/2013/07/shader-tutorial-1/ 动机 自己使用Unity3D也有一段时间了,但是很多时候是流于表面,更多地是把这个引擎简单地用作脚 ...

随机推荐

  1. 路飞学城Python-Day1

    1.什么是编程?编程就是写代码,代码是计算机理解的语言,编程就是通过计算机理解的语言实现一些事件,计算机能理解的就是二进制,就是0和1的两个值计算机底层是电路,如何表达0和1?就像灯只能表示开灯和关灯 ...

  2. 【jQuery04】折叠树

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Docker yum 安装

      [liwm@Eren ~]$ sudo su[root@Eren liwm]# yum install -y docker 已加载插件:fastestmirror, langpacks, prod ...

  4. KVM 日常使用命令

    [root@Eren liwm]# ps ax | grep kvm  681 ?        S<     0:00 [kvm-irqfd-clean]17597 pts/0    S+   ...

  5. Mysql学习总结(22)——Mysql数据库中制作千万级测试表

    前言: 为了方便测试性能.分表等工作,就需要先建立一张比较大的数据表.我这里准备先建一张千万记录用户表. 步骤: 1 创建数据表(MYISAM方式存储插入速度比innodb方式快很多) 数据表描述 数 ...

  6. 洛谷 P2758 编辑距离

    P2758 编辑距离 题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一 ...

  7. Beat &#39;Em Up Game Starter Kit (横版格斗游戏) cocos2d-x游戏源代码

    浓缩精华.专注战斗! 游戏的本质是什么?界面?养成?NoNo!    游戏来源于对实战和比赛的模拟,所以它的本源就是对抗.就是战斗! 是挥洒热血的一种方式! 一个游戏最复杂最难做的是什么?UI?商城? ...

  8. Java读书笔记一(异常处理)

    1.介绍 在开发过程中.都会遇到程序执行时的异常,比如逻辑错误.硬件故障等,本篇博客将会具体的介绍一下Java中的异常处理机制. 2.Try和Catch捕获异常 我们在处理异常过程中经经常使用到的就是 ...

  9. Android平台Camera实时滤镜实现方法探讨(九)--磨皮算法探讨(一)

    上一篇开头提到了一些可用于磨皮的去噪算法.以下我们实现这些算法而且观察效果,咱不考虑实时性的问题 本文首先探讨的首先是<基于局部均方差相关信息的图像去噪及其在实时磨皮美容算法中的应用> 该 ...

  10. 手动配置三大框架整合:Spring+Struts2+mybatis

    如今主流的项目框架中,数据库持久层有可能不是hibernate,而是mybatis或者ibatis,事实上它们都是一样的,以下我来把环境搭建一下: [导入相关jar包]新建web项目projectms ...