原文:Directx11教程(7) 画一个颜色立方体

      前面教程我们通过D3D11画了一个三角形,本章我们将画一个颜色立方体,它的立体感更强。主要的变动是ModelClass类,在ModelClass中定义一个立方体需要的顶点信息,然后创建顶点缓冲和索引缓冲。

     在ModelClass.h中,我们定义一些宏来表示颜色,以便后面给顶点颜色属性赋值时用。

ModelClass.h代码如下:

#pragma once

#include <d3d11.h>
#include <d3dx10math.h>

//定义一些常用颜色
const D3DXVECTOR4 WHITE(1.0f, 1.0f, 1.0f, 1.0f);
const D3DXVECTOR4 BLACK(0.0f, 0.0f, 0.0f, 1.0f);
const D3DXVECTOR4 RED(1.0f, 0.0f, 0.0f, 1.0f);
const D3DXVECTOR4 GREEN(0.0f, 1.0f, 0.0f, 1.0f);
const D3DXVECTOR4 BLUE(0.0f, 0.0f, 1.0f, 1.0f);
const D3DXVECTOR4 YELLOW(1.0f, 1.0f, 0.0f, 1.0f);
const D3DXVECTOR4 CYAN(0.0f, 1.0f, 1.0f, 1.0f); //蓝绿色
const D3DXVECTOR4 MAGENTA(1.0f, 0.0f, 1.0f, 1.0f); //洋红色

const D3DXVECTOR4 BEACH_SAND(1.0f, 0.96f, 0.62f, 1.0f);
const D3DXVECTOR4 LIGHT_YELLOW_GREEN(0.48f, 0.77f, 0.46f, 1.0f);
const D3DXVECTOR4 DARK_YELLOW_GREEN(0.1f, 0.48f, 0.19f, 1.0f);
const D3DXVECTOR4 DARKBROWN(0.45f, 0.39f, 0.34f, 1.0f);

ModelClass.cpp的主要代码如下: bool ModelClass::InitializeBuffers(ID3D11Device* device)
    {
    VertexType* vertices;
    unsigned long* indices;
    D3D11_BUFFER_DESC vertexBufferDesc, indexBufferDesc;
    D3D11_SUBRESOURCE_DATA vertexData, indexData;
    HRESULT result;

    //首先,我们创建2个临时缓冲存放顶点和索引数据,以便后面使用。.

    // 设置顶点缓冲大小为8,一个正方体.
    m_vertexCount = 8;

    // 设置索引缓冲大小.
   m_indexCount = 36;

    // 创建顶点临时缓冲.
    vertices = new VertexType[m_vertexCount];
    if(!vertices)
        {
        return false;
        }

   // 创建索引缓冲.
    indices = new unsigned long[m_indexCount];
    if(!indices)
        {
        return false;
        }
   //创建顺时针方向的三角形,左手规则
    // 设置顶点数据.
    vertices[0].position = D3DXVECTOR3(-1.0f, -1.0f, -1.0f); 
    vertices[0].color = WHITE;

    vertices[1].position = D3DXVECTOR3(-1.0f, 1.0f, -1.0f); 
    vertices[1].color = BLACK;

    vertices[2].position = D3DXVECTOR3(1.0f, 1.0f, -1.0f); 
    vertices[2].color = RED;

    vertices[3].position = D3DXVECTOR3(1.0f, -1.0f, -1.0f); 
    vertices[3].color = GREEN;

    vertices[4].position = D3DXVECTOR3(-1.0f, -1.0f, 1.0f); 
    vertices[4].color = BLUE;

    vertices[5].position = D3DXVECTOR3(-1.0f, 1.0f, 1.0f); 
    vertices[5].color = YELLOW;

    vertices[6].position = D3DXVECTOR3(1.0f, 1.0f, 1.0f); 
    vertices[6].color = CYAN;

    vertices[7].position = D3DXVECTOR3(1.0f, -1.0f, 1.0f); 
    vertices[7].color = MAGENTA;

   // 设置索引缓冲数据.
    indices[0] = 0;  // 前面
    indices[1] = 1;
    indices[2] = 2; 
    indices[3] = 0;
    indices[4] = 2;
    indices[5] = 3; 

    indices[6] = 4;  // 后面
    indices[7] = 6;
    indices[8] = 5; 
    indices[9] = 4;
    indices[10] = 7;
    indices[11] = 6;

    indices[12] = 4;  // 左面
    indices[13] = 5;
    indices[14] = 1; 
    indices[15] = 4;
    indices[16] = 1;
    indices[17] = 0;

    indices[18] = 3;  //右面
    indices[19] = 2;
    indices[20] = 6; 
    indices[21] = 3;
    indices[22] = 6;
    indices[23] = 7;

    indices[24] = 1;  // 上面
    indices[25] = 5;
    indices[26] = 6; 
    indices[27] = 1;
    indices[28] = 6;
    indices[29] = 2;

    indices[30] = 4; // 下面
    indices[31] = 0;
    indices[32] = 3; 
    indices[33] = 4;
    indices[34] = 3;
    indices[35] = 7;

    // 设置顶点缓冲描述
    vertexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
    vertexBufferDesc.ByteWidth = sizeof(VertexType) * m_vertexCount;
    vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    vertexBufferDesc.CPUAccessFlags = 0;
    vertexBufferDesc.MiscFlags = 0;
    vertexBufferDesc.StructureByteStride = 0;

    return true;
    }

CameraClass.cpp中Render函数做了小小变动,使得摄像机始终指向原点:

void CameraClass::Render()
    {

    // 设置摄像机的位置.
    position.x = m_positionX;
    position.y = m_positionY;
    position.z = m_positionZ;

    // 设置摄像机lookat的方向.
    //lookAt.x = 0.0f;
    //lookAt.y = 0.0f;
    //lookAt.z = 1.0f;
    //设置摄像机始终指向原点
    D3DXVec3Normalize(&lookAt, &position);
    lookAt = lookAt * (-1);

   // 得到弧度单位的欧拉旋转 yaw (Y axis), pitch (X axis), 以及 roll (Z axis) .
    pitch = m_rotationX * 0.0174532925f;
    yaw   = m_rotationY * 0.0174532925f;
    roll  = m_rotationZ * 0.0174532925f;

 

    return;
    }

程序运行后如下图所示:

完整的代码请参考:

工程文件myTutorialD3D11_6

代码下载:

http://files.cnblogs.com/mikewolf2002/myTutorialD3D11.zip

Directx11教程(7) 画一个颜色立方体的更多相关文章

  1. Directx11教程(19) 画一个简单的地形

    原文:Directx11教程(19) 画一个简单的地形       通常我们在xz平面定义一个二维的网格,然后y的值根据一定的函数计算得到,比如正弦.余弦函数的组合等等,可以得到一个看似不错的地形或者 ...

  2. Directx11教程(10) 画一个简易坐标轴

    原文:Directx11教程(10) 画一个简易坐标轴       本篇教程中,我们将在三维场景中,画一个简易的坐标轴,分别用红.绿.蓝三种颜色表示x,y,z轴的正向坐标轴. 为此,我们要先建立一个A ...

  3. Directx11教程(5) 画一个简单的三角形(1)

    原文:Directx11教程(5) 画一个简单的三角形(1)       在本篇教程中,我们将通过D3D11画一个简单的三角形.在D3D11中,GPU的渲染主要通过shader来操作(当然还有一些操作 ...

  4. Directx11教程(6) 画一个简单的三角形(2)

    原文:Directx11教程(6) 画一个简单的三角形(2)      在上篇教程中,我们实现了在D3D11中画一个简单的三角形,但是,当我们改变窗口大小时候,三角形形状却随着窗口高宽比例改变而改变, ...

  5. Directx11教程(9) 增加一个TimerClass类

    原文:Directx11教程(9) 增加一个TimerClass类      在上篇教程代码的基础上,我们增加一个TimerClass类,这个类的功能很简单,就是可以计算相邻2帧的时间差.利用这个时间 ...

  6. Directx11教程(11) 增加一个debug宏

    原文:Directx11教程(11) 增加一个debug宏       现在我们在common.h中增加一个debug的宏,在每个d3d11函数后调用,如果d3d函数出错,它能够给出程序中错误的代码行 ...

  7. Directx11教程(56) 建立一个skydome

    原文:Directx11教程(56) 建立一个skydome       本章建立一个skydome(天空穹),主要学习如何使用cube mapping.      cube map就是把六张纹理当作 ...

  8. Directx11学习笔记【十二】 画一个旋转的彩色立方体

    上一次我们学习了如何画一个2D三角形,现在让我们进一步学习如何画一个旋转的彩色立方体吧. 具体流程同画三角形类似,因此不再给出完整代码了,不同的部分会再说明. 由于我们要画彩色的立方体,所以顶点结构体 ...

  9. Directx11教程(4) 一个最基本D3D应用程序(2)

    原文:Directx11教程(4) 一个最基本D3D应用程序(2) 接着上篇教程的代码,本篇加入基本的D3D代码,实现一个完整的D3D11程序框架. 我们增加一个新类D3DClass, 用来处理3D渲 ...

随机推荐

  1. Eureka客户端无法连接服务注册中心

    转载自:https://my.oschina.net/kousm/blog/2249003 服务端 application.yml配置 spring: application: name: eurek ...

  2. 关于SQL查询效率 主要针对sql server

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享:机器情况p4: 2.4内存: 1 Gos: windows 2003数据库: ms sql server 2000目的: 查询性能测试,比 ...

  3. 在windows系统和linux系统中查询IP地址命令的不同

    在linux和windows系统上查询IP地址的命令是不一样的.         在linux中的命令行模式下,输入ifconfig即可查询到IP.而在windows系统下要查询IP地址需要先打开do ...

  4. javascript基础:事件

    事件: 概念:某些组件被执行了某些操作后,触发某些代码的执行 *  事件:某些操作,如:单击,双击,键盘按下了,鼠标移动了 *  事件源:组件.如:按钮   文本输入框.... *  监听器:代码 * ...

  5. Leetcode86. Partition List分隔链表(双指针)

    给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1->4-&g ...

  6. Leetcode448.Find All Numbers Disappeared in an Array找到所有数组中消失的数字

    给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不 ...

  7. 02Redis入门指南笔记(基本数据类型)

    一:热身 获得符合规则的健名列表:keys  pattern pattern支持glob风格的通配符,具体规则如下表: Redis命令不区分大小写.keys命令需要遍历Redis中的所有健,当键的数量 ...

  8. 告别诊断烦恼 | 应用实时监控 ARMS 上线智能和实时诊断功能

    为什么要做这个功能? 作为一款应用性能监控产品,我们通常会给用户展示两类数据: 第一种是统计数据:用户通过使用统计数据设置报警(比如应用响应时间大于2s),缩小问题范围(比如报警时间范围内,是哪一个接 ...

  9. 【html、CSS、javascript-2】CSS基础

    CSS CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. 一 css的四种引入方式 1.行内式          ...

  10. 【linux配置】Linux同步网络时间

    Linux同步网络时间 1.date '+%Y%M%D' 按照格式显示当前日期,结果如下: [root@LAMP ~]# date "+%Y-%m-%d %H:%M:%S" -- ...