(4)Render函数

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

void CubeRenderer::Render()

{

    //背景色

    const float midnightBlue[] = {0.098f,0.098f,0.439f,1.000f};

    //设置背景

    m_d3dContext->ClearRenderTargetView(

        m_renderTargetView.Get(),

        midnightBlue

    );

    //清空深度缓存和模版缓存

    m_d3dContext->ClearDepthStencilView(

        m_depthStencilView.Get(),

        D3D11_CLEAR_DEPTH,

        1.0f,

        0

    );

    if (!m_loadingComplete)

    {

        return;

    }

    //绑定到图形管线的output-merger stage阶段

    m_d3dContext->OMSetRenderTargets(

        1,

        m_renderTargetView.GetAddressOf(),

        m_depthStencilView.Get()

    );

    m_d3dContext->UpdateSubresource(

        m_constantBuffer.Get(),

        0,

        NULL,

        &m_constantBufferData,

        0,

        0

    );

    UINT stride = sizeof(VertexPositionColor);

    UINT offset = 0;

    //将顶点缓存绑定到图形管线的input-assembler stage阶段

    m_d3dContext->IASetVertexBuffers(

        0,

        1,

        m_vertexBuffer.GetAddressOf(),

        &stride,

        &offset

    );

    //将顶点索引的缓存绑定到图形管线的input-assembler stage阶段

    m_d3dContext->IASetIndexBuffer(

        m_indexBuffer.Get(),

        DXGI_FORMAT_R16_UINT,

        0

    );

    //设置图元的拓扑结构为为三角形列表

    m_d3dContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

    //设置输入格式

    m_d3dContext->IASetInputLayout(m_inputLayout.Get());

    //设置顶点着色器

    m_d3dContext->VSSetShader(

        m_vertexShader.Get(),

        nullptr,

        0

    );

    //顶点着色器的常量缓存

    m_d3dContext->VSSetConstantBuffers(

        0,

        1,

        m_constantBuffer.GetAddressOf()

    );

    //设置像素着色器

    m_d3dContext->PSSetShader(

        m_pixelShader.Get(),

        nullptr,

        0

    );

    //绘制立体图型

    m_d3dContext->DrawIndexed(

        m_indexCount,

        0,

        0

    );

}

在上面的代码中,首先定义一个const float类型的数组midnightBlue,用来存储一个RGBA颜色值,并在ClearRenderTargetView函数中使用这个颜色值来设置应用窗口的背景。接着调用ClearDepthStencilView函数清空深度缓存和模版缓存,其中深度缓存用于进行深度测试,经过深度测试以后在应用窗口中将实现靠近屏幕的物体遮挡远离屏幕的物体的效果,而模版缓存则用于将像素进行模版测试,经过模版测试后此像素将可以写入到后台缓存中。

接下来将相应的数据绑定到图形管线的output-merger stage阶段,以便于最终将图形绘制到应用窗口中。调用OMSetRenderTargets函数将渲染目标视图和深度模版视图绑定到图形管线的output-merger stage阶段,这两个视图是绘制立体图形的过程中所需要的资源。然后调用IASetVertexBuffers函数和IASetIndexBuffer函数分别将顶点缓存和顶点索引缓存绑定到图形管线的output-merger stage阶段。

调用IASetPrimitiveTopology函数设置图元的拓扑结构为三角形列表,并调用VSSetShader函数和VSSetConstantBuffers函数来分别设置顶点着色器和顶点着色器的常量缓存,接着调用PSSetShader函数来设置像素着色器,最后调用DrawIndexed函数来绘制立体图形。

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

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

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

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

    (3)CreateDeviceResources函数 CreateDeviceResources函数默认添加在CubeRenderer.cpp源文件中,此函数用于创建着色器和立体图形顶点.接下来分别介 ...

  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. [原][osgEarth][JSBSim]重新整理使用JSBSim飞机动力模拟的使用

    JSBSim是一个模拟飞机飞行空气动力学的,这些都不用深入理解,只要知道自己程序怎么和JSBSim交互就行了 我使用的是JSBSim-Win32-0.9.13 原理:改写jsbsim的FGInput ...

  2. ubuntu 18.04编译opencv3.4.3 with python3.6 cuda9.2 gdal

    惭愧,之前一直没在linux下编译过opencv,也没用过纯命令行版的cmake,现在咬牙编译一次.其实感觉还凑合. opencv官网文档还是那么烂:https://docs.opencv.org/m ...

  3. c# 写入Xml 元素(<![CDATA[ ]]>)

    一般处理程序代码: XmlDocument xmldoc = new XmlDocument();             xmldoc.AppendChild(xmldoc.CreateXmlDec ...

  4. <%@page contentType="text/html;charset=gbk"%> 与 <meta http-equiv="Content-Type" content="text/html; charset=GBK">区别

    前一个是在服务端起作用,是告诉应用服务器采用何种编码输出JSP文件流, 后一个是在客户端起作用,是告诉浏览器是采用何种编码方式显示HTML页面

  5. HeadFIrst Ruby 第七章总结 hashes

    前言 这一章节介绍了 Ruby 中 hash 这一数据类型的用法和特征. Hash 的定义 与 array 的对比 最大的不同: An array can only use integers as i ...

  6. 怎么检测自己fastq的Phred类型 | phred33 phred64

    http://wiki.bits.vib.be/index.php/Identify_the_Phred_scale_of_quality_scores_used_in_fastQ # S - San ...

  7. WCF初见之SQL数据库的增删改查

    1.首先要连接数据库,自然要有数据库啦,创建一个数据库表Login,并插入一个数据: --创建数据库表login CREATE TABLE Login ( UName VARCHAR(20) PRIM ...

  8. python3-知识扩展扫盲易忘-generator的用法

    前部分转自: https://www.cnblogs.com/Tsukasa/p/6613934.html 通过列表list生成器,我们可以直接创建一个列表 ? 1 2 3 >>> ...

  9. Practical Node.js (2018版) 第3章:测试/Mocha.js, Chai.js, Expect.js

    TDD and BDD for Node.js with Mocha TDD测试驱动开发.自动测试代码. BDD: behavior-driven development行为驱动开发,基于TDD.一种 ...

  10. apiCloud 版本号

    应用版本号:this.appVersion = api.appVersion; 更新系版本的时候可用来比较