zoukankan      html  css  js  c++  java
  • Win10系列:VC++ Direct3D模板介绍3

    (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函数来绘制立体图形。

  • 相关阅读:
    正则表达式匹配负数和数字
    下拉框select chosen被遮盖
    获取JavaScript对象的方法
    管理机--Jumpserver由docker搭建
    腾讯云--腾讯云sdk-实现脚本修改腾讯云负载均衡权重
    Linux系统中使用confluence构建企业wiki
    腾讯云--对象存储cos绑定自定义域名
    python(一)python的操作符
    pytest(五)用例传fixture参数
    pytest(四)firture自定义用例预置条件
  • 原文地址:https://www.cnblogs.com/finehappy/p/6645658.html
Copyright © 2011-2022 走看看