(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. eclipse中配置maven和创建第一个 Spring Boot Application

    关于Maven的下载.环境变量的配置自行百度,今天记录一下在Eclipse中配置Maven的操作: mvn -v 出现上图说明maven和jdk的要求都达到了(jdk要8.0及以上的版本) 然后在ec ...

  2. python使用sessions模拟登录淘宝

    之前想爬取一些淘宝的数据,后来发现需要登录,找了很多的资料,有个使用request的sessions加上cookie来登录的,cookie的获取在登录后使用开发者工具可以找到.不过这个登录后获得的网页 ...

  3. 用aws cli 下载s3中数据到本地

    参考https://blog.csdn.net/DynastyRumble/article/details/76649120 1 首先注册AWS账户,绑定信用卡.一定要填写正确的手机,因为验证方式是它 ...

  4. anaconda 安装包

    很多包在anaconda navigator里搜不到 如果为了在host编译opencv而在bashrc和profile里屏蔽了anaconda的路径,则 使用$HOME/anaconda3/bin/ ...

  5. linux基础07-bash编程(变量,变量类型)

    (1)shell: 弱类型编程语言 强:变量在使用前,必须事先声明,甚至还需要初始化:弱:变量用时声明,甚至不区分类型: 变量赋值:VAR_NAME=VALUE (2)bash变量类型: 环境变量 本 ...

  6. ionic service

    当你初试 Angular 时,很自然地就会往 controller 和 scope 里堆满不必要的逻辑.一定要早点意识到,controller 这一层应该很薄:也就是说,应用里大部分的业务逻辑和持久化 ...

  7. 原生JS操作iframe里的dom

    转:http://www.css88.com/archives/2343 一.父级窗口操作iframe里的dom JS操作iframe里的dom可是使用contentWindow属性,contentW ...

  8. C#获取路径中最后一个文件夹的名字

    using System; using System.IO; namespace ConsoleApplication1 { class Program { static void Main(stri ...

  9. springmvc如何进行热部署开发

    1.场景还原 在工程量大的情况下,tomcat运行部署一次会花费相当多的时间,这样太 浪费人力以及时间了:今天笔者将 讲解一下如何配置springmvc工程的热部署 2.实现方案 其实很简单! ①在t ...

  10. python – time.sleep – 睡眠线程

    import time from threading import Thread class worker(Thread): def run(self): for x in xrange(0,11): ...