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

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

      前面教程我们通过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;
    }

程序运行后如下图所示:

image

完整的代码请参考:

工程文件myTutorialD3D11_6

代码下载:

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

相关文章
|
1月前
|
程序员 C# 图形学
Unity3D学习笔记1——绘制一个三角形
Unity3D学习笔记1——绘制一个三角形
35 0
|
前端开发
Delphi绘图功能[1] —— 入门(绘制直线和矩形)
Delphi绘图功能[1] —— 入门(绘制直线和矩形)
448 0
Delphi绘图功能[1] —— 入门(绘制直线和矩形)
openGL简明教程(一)---开始的开始,绘制一个三角形
openGL简明教程(一)---开始的开始,绘制一个三角形
247 0
|
数据建模
Directx11教程(43) 纹理映射(13)-动态纹理映射
本篇教程中,我们将在前面基于光照的地形与水面程序里面加上纹理映射,而且我们会基于时间动态改变水面的纹理坐标,实现水面纹理波动的效果。       地形(山谷)以及水面都是基于网格的平面。
956 0
Directx11教程(35) 纹理映射(5)
到现在为止,我们的TextureClass初始化函数非常简单,说白了就是一行代码: result = D3DX11CreateShaderResourceViewFromFile(device, filename, NULL, NULL, &m_texture, NULL);       这行代码装入一个dds文件,而且其它选项都设置为NULL,这时系统会使用装入文件本身的格式,比如我们装入的tong.dds, 前面我们为其产生了mipmaps层,并且设置surface格式为DXT5(对应于D3D11中BC3压缩格式)。
882 0
|
索引
Directx11教程36 纹理映射(6)
本章主要是整理代码,做以下两件事情: 1、把世界坐标矩阵的计算,放在GraphicsClass的渲染函数中,之前放在D3DClass中,而且只是返回一个单位矩阵,没任何作用。如果要使其起作用,就要对每个model类都单独设置,很麻烦,比如我要画两个颜色立方体,岂不是要建立两个model类,而只是世界坐标矩阵不同。
827 0
|
存储 索引
Directx11教程39 纹理映射(9)
在myTutorialD3D11_32中,我们在PlaneModelClass中增加一个纹理TextureClass* m_Texture;读入一个grass的纹理,程序执行后的效果如下: 完整的代码请参考: 工程文件myTutorialD3D11_32 代码下载: http://files.
918 0
Directx11教程41 纹理映射(11)
1、第一副图我们采用各性异性的滤波方式,并设置最大各性异性值为8.     samplerDesc.Filter =  D3D11_FILTER_ANISOTROPIC;     samplerDesc.MaxAnisotropy = 8;      第二副图我们用了常用的3线性差值滤波方式   samplerDesc.Filter =  D3D11_FILTER_MIN_MAG_MIP_LINEAR;         按道理说,对于远处的纹理贴图,第一副图要好些,但我看起来,似乎这两个效果差不多,第二副效果也还可以,对于远处的贴图,我并没有发现模糊的效果。
922 0