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

时间:2023-02-05 13:14:48

原文:Directx11教程(10) 画一个简易坐标轴

      本篇教程中,我们将在三维场景中,画一个简易的坐标轴,分别用红、绿、蓝三种颜色表示x,y,z轴的正向坐标轴。

为此,我们要先建立一个AxisModelClass类,来表示坐标轴顶点。

      现在系统类之间的关系图如下:

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

AxisModelClass类和前面的ModelClass类相似,只是创建顶点缓冲和索引缓冲时,指定了3条线段,表示三个坐标轴。

AxisModelClass.h的主要代码如下:

#pragma once

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

class AxisModelClass
    { 

        void RenderBuffers(ID3D11DeviceContext*);
       //顶点缓冲和顶点索引缓冲
        ID3D11Buffer *m_vertexBuffer, *m_indexBuffer;
        int m_vertexCount, m_indexCount;
    };

AxisModelClass.cpp的主要代码如下:

#include "AxisModelClass.h"

bool AxisModelClass::InitializeBuffers(ID3D11Device* device)
    {
    VertexType* vertices;
    unsigned long* indices;
    D3D11_BUFFER_DESC vertexBufferDesc, indexBufferDesc;
    D3D11_SUBRESOURCE_DATA vertexData, indexData;
    HRESULT result;

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

    // 设置顶点缓冲大小为6
    m_vertexCount = 6;

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

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

   // 创建索引缓冲.
    indices = new unsigned long[m_indexCount];
    if(!indices)
        {
        return false;
        }

    // 设置顶点数据.
    //x轴,红色
    vertices[0].position = D3DXVECTOR3(0.0f, 0.0f, 0.0f); 
    vertices[0].color = RED;

    vertices[1].position = D3DXVECTOR3(10.0f, 0.0f, 0.0f); 
    vertices[1].color = RED;

    //y轴,绿色
    vertices[2].position = D3DXVECTOR3(0.0f, 0.0f, 0.0f); 
    vertices[2].color = GREEN;

    vertices[3].position = D3DXVECTOR3(0.0f, 10.0f, 0.0f); 
    vertices[3].color = GREEN;

   //z轴,蓝色
    vertices[4].position = D3DXVECTOR3(0.0f, 0.0f, 0.0f); 
    vertices[4].color = BLUE;

    vertices[5].position = D3DXVECTOR3(0.0f, 0.0f, 10.0f); 
    vertices[5].color = BLUE;

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


    return true;
    }

void AxisModelClass::RenderBuffers(ID3D11DeviceContext* deviceContext)
    {
    unsigned int stride;
    unsigned int offset;

    // 设置顶点缓冲跨度和偏移.
    stride = sizeof(VertexType);
    offset = 0;

    //在input assemberl阶段绑定顶点缓冲,以便能够被渲染
    deviceContext->IASetVertexBuffers(0, 1, &m_vertexBuffer, &stride, &offset);

    //在input assemberl阶段绑定索引缓冲,以便能够被渲染
    deviceContext->IASetIndexBuffer(m_indexBuffer, DXGI_FORMAT_R32_UINT, 0);

    // 设置体元语义,渲染线段,画出坐标轴 

注意:这儿指定画的体元为线段列表
    deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST);

    return;
    }

为了使用颜色宏定义,我么去掉了上篇文章在ModelClass.h 中定义的颜色,而新建一个common.h文件,

ModelClass.h中将包含common.h

ModelClass.h代码改变如下:

#pragma once

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

class ModelClass
    {

    };

common.h的代码如下:

//定义一些常用颜色
#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);

GraphicsClass.h修改的代码如下:

#pragma once

#include "modelclass.h"
#include "AxisModelClass.h"
#include "colorshaderclass.h"

class GraphicsClass
    { 

        ModelClass* m_Model;
        AxisModelClass* m_AxisModel;
        ColorShaderClass* m_ColorShader;

    };

GraphicsClass.cpp代码如下:

#include "GraphicsClass.h"

GraphicsClass::GraphicsClass(void)
    {
    m_D3D = 0;
    m_Camera = 0;
    m_Model = 0;
    m_AxisModel = 0;
    m_ColorShader = 0;
   
    }

bool GraphicsClass:: Initialize(int screenWidth, int screenHeight, HWND hwnd)
    { 
   …

   // 创轴建模型对象.
    m_AxisModel = new AxisModelClass;
    if(!m_AxisModel)
        {
        return false;
        }
    // 初始化坐标轴模型对象.
    result = m_AxisModel->Initialize(m_D3D->GetDevice());
    if(!result)
        {
        MessageBox(hwnd, L"Could not initialize the axis model object.", L"Error", MB_OK);
        return false;
        }

    return true;
    }

bool GraphicsClass::Frame()
    {
    bool result;

    // 调用Render函数,渲染3D场景
    // Render是GraphicsClass的私有函数.
    result = Render();
    if(!result)
        {
        return false;
        }

    return true;
    }

bool GraphicsClass::Render()
    {

    D3DXMATRIX viewMatrix, projectionMatrix, worldMatrix;
    bool result;

    // 设置framebuffer.为浅蓝色
    m_D3D->BeginScene(0.0f, 0.0f, 0.5f, 1.0f);

    // 得到3个矩阵.
    m_Camera->getViewMatrix(&viewMatrix);
    m_D3D->GetWorldMatrix(worldMatrix);
    m_D3D->GetProjectionMatrix(projectionMatrix);

    m_AxisModel->Render(m_D3D->GetDeviceContext());
    // 用shader渲染.
    result = m_ColorShader->Render(m_D3D->GetDeviceContext(), m_AxisModel->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix);
    if(!result)
        {
        return false;
        }   
    // 把模型顶点和索引缓冲放入管线,准备渲染.
    m_Model->Render(m_D3D->GetDeviceContext());

    // 用shader渲染.
    result = m_ColorShader->Render(m_D3D->GetDeviceContext(), m_Model->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix);
    if(!result)
        {
        return false;
        }
   
   //把framebuffer中的图像present到屏幕上.
    m_D3D->EndScene();

    return true;
    }

程序执行后,如下图所示:

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

 

完整的代码请参考:

工程文件myTutorialD3D11_9

代码下载:

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

Directx11教程(10) 画一个简易坐标轴的更多相关文章

  1. Directx11教程&lpar;19&rpar; 画一个简单的地形

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

  2. Directx11教程&lpar;7&rpar; 画一个颜色立方体

    原文:Directx11教程(7) 画一个颜色立方体       前面教程我们通过D3D11画了一个三角形,本章我们将画一个颜色立方体,它的立体感更强.主要的变动是ModelClass类,在Model ...

  3. Directx11教程&lpar;6&rpar; 画一个简单的三角形&lpar;2&rpar;

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

  4. Directx11教程&lpar;5&rpar; 画一个简单的三角形&lpar;1&rpar;

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

  5. Directx11教程&lpar;56&rpar; 建立一个skydome

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

  6. Directx11教程&lpar;11&rpar; 增加一个debug宏

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

  7. Directx11教程&lpar;9&rpar; 增加一个TimerClass类

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

  8. 使用Python画一个带坐标轴的圆

    Download Microsoft Visual Studio Microsoft Visual Studio enables you develop your python Application ...

  9. Directx11教程40 纹理映射&lpar;10&rpar;

    原文:Directx11教程40 纹理映射(10)      本章尝试使用纹理行列式,或者说纹理数组,在ps中,使用2个纹理,最终的像素颜色,是光照颜色*纹理1采样颜色*纹理2采样颜色,主要是想达到如 ...

随机推荐

  1. VMware下设置CentOS虚拟机与主机同一网段

    由于在开发中经常使用到自己的电脑搭建虚拟机器进行个人开发,而虚拟机器每次登录所使用的命令行界面比较小,看起来也不舒服.以下主要对centos虚拟机器下配置与主机共享同一网段IP,通过第三方软件(put ...

  2. SQLServer 网络协议(一)

    SQLserver现在主要的3种协议:Shared Memory.TCP/IP 和 Named Pipe SharedMemory: Shared Memory最快最简单的协议,使用SharedMem ...

  3. PHP垃圾回收机制理解

    使用的是"引用计数"方式进行回收.简单地理解的话,就是每个分配的内存区域都有一个计数器,记录有多少个变量指针指向这片内存.当指向该片内存的指针数量为0,那么该片内存区域就可以被回收 ...

  4. Java多线程的创建与简单使用

    一.线程的基本概念 什么是线程:Thread 进程内部的一个执行单元,它是程序中一个单一的顺序控制流程. 线程又被称为轻量级进程(lightweight process) 如果在一个进程中同时运行了多 ...

  5. 51Nod 1090 3个数和为0

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1090 思路:排序 三个for循环 但是要控制循环 不能从头开 ...

  6. 【原创】kerberos无密码登录

    通常在远程客户端上登录kerbros都需要密码,在学习hadoop的时候提到了ktutil这个工具,这里将使用方法贴出来. 用到的命令如下: 1.ktutil 2.add_entry -passwor ...

  7. JAVA classpath jar问题&lbrack;zz&rsqb;

    classpath问题可以说是所有初学者头疼的问题,偶也一样. 1) classpath的作用:  它的作用就事让java找到你所要执行,或你拥有的类. 2) classpath的设置:  设置cla ...

  8. linux下一个监测进程CPU和MEM使用率的shell脚本

    #!/bin/bashPID=$1 cpu=`ps --no-heading --pid=$PID -o pcpu`mem=`ps --no-heading --pid=$PID -o pmem`ec ...

  9. Fork开源项目之通讯框架

    项目发布于:https://github.com/HouZhiHouJue/IOCPMSG.看代码前请先看简介.

  10. 聊一聊HTML &lt&semi;&excl;--…--&gt&semi;标签

    定义 注释标签用于在html源代码中插入注释.注释不会在浏览器上显示. 用法 根据定义的基本用法,代码如下 <!-- 这是一段注释,我不会显示在页面上 --> 浏览器的支持情况 所有浏览器 ...