(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. Matlab中的基本数据类型介绍

    Matlab中支持的数据类型包括: 逻辑(logical)字符(char)数值(numeric)元胞数组(cell)结构体(structure)表格(table)函数句柄(function handl ...

  2. Qt532.QString_填充字符

    1.代码: void MainWindow::on_pushButton_clicked() { QString str = "; QString str01 = str.leftJusti ...

  3. [原][源码][tinyxml][opencv]按照规格剪切所有的图片

    源码: #include <iostream> #include <fstream> #include <opencv2/core/core.hpp> #inclu ...

  4. SpringBoot的文件上传

    先在src/main/resources下新建一个static目录用以存放html页面,简单的html页面如下 <!DOCTYPE html> <html> <head& ...

  5. Java == 和 equals 区别

    先来看一段代码 1. String str1 = new String("hello");//堆中分配一块内存,存放"hello",str1 指向内存地址 2. ...

  6. Codeforces 551 E - GukiZ and GukiZiana

    E - GukiZ and GukiZiana 思路:分块, 块内二分 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC ...

  7. Integer与int区别

    Integer与int的区别:估计大多数人只会说道两点,一开始我也不太清楚,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i ...

  8. 解决微信video全屏的问题,不在本页面播放

    在微信浏览器中使用video标签,点击播放会跳出本页面,自动进行全屏播放,原因是自动跳转到手机微信内置的浏览器中去播放去了!!! 在video中加上连个属性就好了,反正最近的一个项目,我是这样做的就好 ...

  9. C++ 输出文件编码控制

    c++ 读写文件需要包含fstream头文件. 读文件声明形如:  ifstream fin("路径"): 写文件声明形如:ofstream fout("路径" ...

  10. 大数据量 与 UI交互时的处理 总结与心得

    [以下均在主线程中操作时]1.UI直接操作,数据量较大时,直接使用UI会非常慢2.数据驱动操作,数据量较大时,数据与UI的交互效率相比“1”提升明显 总结:但以上这两种操作  都会“较长时间”占用主线 ...