(3)CreateDeviceResources函数

CreateDeviceResources函数默认添加在CubeRenderer.cpp源文件中,此函数用于创建着色器和立体图形顶点。接下来分别介绍CreateDeviceResources函数中用于创建着色器和立体图形顶点的具体实现代码,首先来看创建着色器的代码。

在介绍CreateDeviceResources函数中用于创建着色器的实现代码之前,首先来了解在创建着色器的过程中将会用到的变量,这些变量声明在了CubeRenderer.h头文件中,代码如下所示:

private:

    //声明成员变量m_vertexShader

    Microsoft::WRL::ComPtr<ID3D11VertexShader> m_vertexShader;

    //声明成员变量m_pixelShader

    Microsoft::WRL::ComPtr<ID3D11PixelShader> m_pixelShader;

    //声明成员变量m_inputLayout

    Microsoft::WRL::ComPtr<ID3D11InputLayout> m_inputLayout;

在上面的代码中,使用private关键字声明三个私有的成员变量,分别为m_vertexShader、m_pixelShader和m_inputLayout,其中m_vertexShader为ID3D11VertexShader类型的指针,m_pixelShader为ID3D11PixelShader类型的指针,m_inputLayout为ID3D11InputLayout类型的指针。

在CreateDeviceResources函数中用于创建着色器的代码如下所示:

//读取顶点着色器解析文件

auto loadVSTask = DX::ReadDataAsync("SimpleVertexShader.cso");

//读取像素着色器解析文件

auto loadPSTask = DX::ReadDataAsync("SimplePixelShader.cso");

auto createVSTask = loadVSTask.then([this](Platform::Array<byte>^ fileData) {

    //创建顶点着色器

    DX::ThrowIfFailed(

        m_d3dDevice->CreateVertexShader(

            fileData->Data,

            fileData->Length,

            nullptr,

            &m_vertexShader

        )

    );

    //描述了立体图形顶点的位置和颜色信息

    const D3D11_INPUT_ELEMENT_DESC vertexDesc[] =

    {

        {"POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT,0,0, D3D11_INPUT_PER_VERTEX_DATA,0},

        { "COLOR",0,DXGI_FORMAT_R32G32B32_FLOAT,0,12, D3D11_INPUT_PER_VERTEX_DATA,0},

    };

    //得到ID3D11InputLayout的对象

    DX::ThrowIfFailed(

        m_d3dDevice->CreateInputLayout(

            vertexDesc,

            ARRAYSIZE(vertexDesc),

            fileData->Data,

            fileData->Length,

            &m_inputLayout

        )

    );

});

auto createPSTask = loadPSTask.then([this](Platform::Array<byte>^ fileData) {

    //创建像素着色器

    DX::ThrowIfFailed(

        m_d3dDevice->CreatePixelShader(

            fileData->Data,

            fileData->Length,

            nullptr,

            &m_pixelShader

        )

    );

    //得到储存ModelViewProjectionConstantBuffer结构体的缓存

    CD3D11_BUFFER_DESC constantBufferDesc(sizeof(ModelViewProjectionConstantBuffer), D3D11_BIND_CONSTANT_BUFFER);

    DX::ThrowIfFailed(

        m_d3dDevice->CreateBuffer(

            &constantBufferDesc,

            nullptr,

            &m_constantBuffer

        )

    );

});

在上面的代码中,首先调用ReadDataAsync函数分别读取资源文件SimpleVertexShader.cso和SimplePixelShader.cso,这两个资源文件是编译项目中的SimplePixelShader.hlsl文件和SimpleVertexShader.hlsl文件所得到的文件。接着以读取SimpleVertexShader.cso资源文件所得到的数据和此数据的长度作为参数,调用CreateVertexShader函数得到一个ID3D11VertexShader类型的对象作为顶点着色器,并使用m_vertexShader指针指向这个对象。接着定义一个D3D11_INPUT_ELEMENT_DESC类型的数组vertexDesc,此数组用于描述立体图形顶点的位置和颜色信息,并以vertexDesc数组作为参数调用CreateInputLayout函数得到一个ID3D11InputLayout类型的对象,使用m_inputLayout指针指向这个对象。

接下来以读取SimplePixelShader.cso资源文件将所得到的数据和此数据的长度作为参数,调用CreatePixelShader函数得到一个ID3D11PixelShader类型的对象作为像素着色器,并使用m_pixelShader指针指向这个对象。然后定义一个CD3D11_BUFFER_DESC结构体的变量constantBufferDesc,以constantBufferDesc结构体变量作为参数调用CreateBuffer函数来得到一个用于存储ModelViewProjectionConstantBuffer结构体的缓存,使用m_constantBuffer指针指向此缓存。

讲解了创建着色器的代码以后,接着来介绍创建立体图形顶点的代码。在创建立体图形顶点的过程中会用到一个VertexPositionColor结构体,此结构体默认定义在CubeRenderer.h头文件中,代码如下所示:

struct VertexPositionColor

{

    DirectX::XMFLOAT3 pos;

    DirectX::XMFLOAT3 color;

};

在VertexPositionColor结构体中定义了两个XMFLOAT3结构体的变量pos和color,分别用于存储立体图形顶点的位置信息和颜色信息。

CubeRenderer.cpp源文件的CreateDeviceResources函数用于实现创建立体图形顶点的代码如下所示:

auto createCubeTask = (createPSTask && createVSTask).then([this] () {

    //定义数组cubeVertices

    VertexPositionColor cubeVertices[] =

    {

    {XMFLOAT3(-0.5f,-0.5f,-0.5f),XMFLOAT3(0.0f,0.0f,0.0f)},

    {XMFLOAT3(-0.5f,-0.5f,0.5f),XMFLOAT3(0.0f,0.0f,1.0f)},

    {XMFLOAT3(-0.5f,0.5f,-0.5f),XMFLOAT3(0.0f,1.0f,0.0f)},

    {XMFLOAT3(-0.5f,0.5f,0.5f),XMFLOAT3(0.0f,1.0f,1.0f)},

    {XMFLOAT3( 0.5f,-0.5f,-0.5f),XMFLOAT3(1.0f,0.0f,0.0f)},

    {XMFLOAT3( 0.5f,-0.5f,0.5f),XMFLOAT3(1.0f,0.0f,1.0f)},

    {XMFLOAT3( 0.5f,0.5f,-0.5f),XMFLOAT3(1.0f,1.0f,0.0f)},

    {XMFLOAT3( 0.5f,0.5f,0.5f),XMFLOAT3(1.0f,1.0f,1.0f)},

    };

    //创建cubeVertices缓存

    D3D11_SUBRESOURCE_DATA vertexBufferData = {0};

    vertexBufferData.pSysMem = cubeVertices;

    vertexBufferData.SysMemPitch = 0;

    vertexBufferData.SysMemSlicePitch = 0;

    CD3D11_BUFFER_DESC vertexBufferDesc(sizeof(cubeVertices), D3D11_BIND_VERTEX_BUFFER);

    DX::ThrowIfFailed(

        m_d3dDevice->CreateBuffer(

            &vertexBufferDesc,

            &vertexBufferData,

            &m_vertexBuffer

        )

    );

    //定义数组cubeIndices

    unsigned short cubeIndices[] =

    {

        0,2,1,

        1,2,3,

        4,5,6,

        5,7,6,

        0,1,5,

        0,5,4,

        2,6,7,

        2,7,3,

        0,4,6,

        0,6,2,

        1,3,7,

        1,7,5,

    };

    //得到cubeIndices数组的大小

    m_indexCount = ARRAYSIZE(cubeIndices);

    //创建cubeIndices缓存

    D3D11_SUBRESOURCE_DATA indexBufferData = {0};

    indexBufferData.pSysMem = cubeIndices;

    indexBufferData.SysMemPitch = 0;

    indexBufferData.SysMemSlicePitch = 0;

    CD3D11_BUFFER_DESC indexBufferDesc(sizeof(cubeIndices), D3D11_BIND_INDEX_BUFFER);

    DX::ThrowIfFailed(

        m_d3dDevice->CreateBuffer(

            &indexBufferDesc,

            &indexBufferData,

            &m_indexBuffer

        )

    );

});

在上面的代码中,首先定义一个VertexPositionColor类型的数组cubeVertices,用来存储立体图形的位置和颜色信息,其中位置信息指立体图形顶点的X轴、Y轴和Z轴的坐标,这里使用XMFLOAT3结构体来储存这三个坐标,而颜色信息则指顶点的RGB值,同样可以使用XMFLOAT3结构体来储存顶点的RGB值。

接下来定义一个D3D11_SUBRESOURCE_DATA结构体的变量vertexBufferData,将cubeVertices数组赋值给vertexBufferData结构体变量的成员pSysMem,并将此结构体变量的成员SysMemPitch和SysMemSlicePitch都赋值为0。然后定义一个CD3D11_BUFFER_DESC结构体的变量vertexBufferDesc,以vertexBufferData结构体变量和vertexBufferDesc结构体变量作为参数调用CreateBuffer函数得到一个用于储存立体图形顶点信息的缓存,并使用m_vertexBuffer指针指向此缓存。

然后定义一个unsigned short类型的数组cubeIndices,在此数组中储存了立体图形的36个顶点索引,其中每三个相邻的顶点索引用于绘制一个三角形。接着定义一个D3D11_SUBRESOURCE_DATA结构体的变量indexBufferData,将此结构体变量的成员pSysMem赋值为cubeIndices数组,并把成员SysMemPitch和SysMemSlicePitch都赋值为0。最后定义一个CD3D11_BUFFER_DESC结构体的变量indexBufferDesc,以indexBufferData结构体变量和indexBufferDesc结构体变量作为参数调用CreateBuffer函数得到一个用于储存立体图形顶点索引的缓存,并使用m_indexBuffer指针指向此缓存。

Win10系列:VC++ Direct3D模板介绍2的更多相关文章

  1. Win10系列:VC++ Direct3D模板介绍1

    Visual Studio为开发Direct3D应用程序提供了便捷的模版,读者可以不必手动去新建Direct3D中所使用到的基础资源,而只需专注于图形的绘制.本小节主要为读者介绍这个模版中用于绘制图形 ...

  2. Win10系列:VC++ Direct3D模板介绍3

    (4)Render函数 默认定义在CubeRenderer.cpp源文件中的Render函数用于绘制立体图形,此函数的实现代码如下所示: void CubeRenderer::Render() {   ...

  3. Win10系列:JavaScript 模板绑定

    WinJS库模板提供了一种格式化显示多条数据的便捷方式,通过这种方式可以将模板与ListView或FlipView等控件结合使用以控制数据的显示格式.定义一个WinJS库模板的方法与定义WinJS库控 ...

  4. Java 集合系列 05 Vector详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  5. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(9)-TT模板的学习

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(9)-TT模板的学习 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2): ...

  6. Spring Cloud系列(二) 介绍

    Spring Cloud系列(一) 介绍 Spring Cloud是基于Spring Boot实现的微服务架构开发工具.它为微服务架构中涉及的配置管理.服务治理.断路器.智能路由.微代理.控制总线.全 ...

  7. Docker系列之原理简单介绍

    目录 1.1.Docker架构简介 1.2.Docker 两个主要部件 1.3.虚拟机和Docker对比: 1.4.Docker内部结构 Docker系列之原理简单介绍 @ Docker是一个开源的应 ...

  8. Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  9. Java 集合系列 10 Hashtable详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

随机推荐

  1. asp.net 虹软人脸识别sdk 释放内存

    初始化时申请内存,用完记得释放,不然就会报“内存已满”的. 使用时: pMem = Marshal.AllocHGlobal(detectSize); 释放内存: Marshal.FreeHGloba ...

  2. 不要在Lua中使用os.clock()函数

    1.os.clock函数的实现是调用了c语言的函数函数库,实现代码如下: static int os_clock (lua_State *L) { lua_pushnumber(L, ((lua_Nu ...

  3. gulp自动化打包工具

    /** * Created by hasee on 2016/7/5. */var gulp = require('gulp');var sass = require('gulp-sass');//容 ...

  4. Mac 如何安装 chromedriver

    1.使用brew  命令 前提是要安装 brew 这里不做介绍 使用命令 brew install chromedriver 如上图出现错误,根据提示可以使用如下命令安装 brew cask inst ...

  5. ajax和iframe区别

    ajax和iframe https://segmentfault.com/a/1190000011967786 ajax和iframe的区别 1.都是局部刷新 2.iframe是同步的,而ajax是异 ...

  6. SpringBoot集成ActiveMQ

    前面提到了原生API访问ActiveMQ和Spring集成ActiveMQ.今天讲一下SpringBoot集成ActiveMQ.SpringBoot就是为了解决我们的Maven配置烦恼而生,因此使用S ...

  7. JS 日期比较方法

    1.日期参数格式:yyyy-mm-dd // a: 日期a, b: 日期b, flag: 返回的结果 function duibi(a, b,flag) { var arr = a.split(&qu ...

  8. java8新特性(二)_lambda表达式

    最近一直找java8相关新特性的文章,发现都太没有一个连贯性,毕竟大家写博客肯定都有自己的侧重点,这里找到一本书,专门介绍java8新特性的,感觉大家可以看看<写给大忙人看的JavaSE8> ...

  9. English trip EM2-PE-1B Teacher:Patirck

    PE = 演讲课 课上内容(Lesson) How are you today?  你今天怎么样? What is your name?  你的名字叫什么? What do you come from ...

  10. Children's Game UVA - 10905

    看90,956这样的串,在比较完之前,就确定大小的,必定选大的放在前.而x=98,y=980;这样的,比较x+y和y+x的大小.如果x+y更小,y就放前. #include <iostream& ...