原文:DirectX11笔记(十一)--Direct3D渲染7--RENDER STATES

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010333737/article/details/78787555


概述

  Direct3D 本质上是一个状态机, 所有的东西在我们手动改变之前都会始终保持在当前的状态, 比如之前提到的 input layout, vertex buffer 以及 index buffer 都是这样. Direct3D 提供了一些接口来封装用于配置 Direct3D 某些相关功能的属性.

  • ID3D11RasterizerState
  • ID3D11BlendState
  • ID3D11BlendState

  后两个默认关闭, 我们暂时也无需使用, 所以先不做说明.


ID3D11RasterizerState

  这个接口用来配置渲染管线的光栅化阶段. 我们可以使用下面的方法来创建一个 ID3D11RasterizerState.

HRESULT ID3D11Device::CreateRasterizerState(
const D3D11_RASTERIZER_DESC *pRasterizerDesc,
ID3D11RasterizerState **ppRasterizerState);

  第一个参数是对应的描述, 第二个参数是出参, 返回创建的 ID3D11RasterizerState.


D3D11_RASTERIZER_DESC

typedef struct D3D11_RASTERIZER_DESC {
D3D11_FILL_MODE FillMode; // Default: D3D11_FILL_SOLID
D3D11_CULL_MODE CullMode; // Default: D3D11_CULL_BACK
BOOL FrontCounterClockwise; // Default: false
INT DepthBias; // Default: 0
FLOAT DepthBiasClamp; // Default: 0.0f
FLOAT SlopeScaledDepthBias; // Default: 0.0f
BOOL DepthClipEnable; // Default: true
BOOL ScissorEnable; // Default: false
BOOL MultisampleEnable; // Default: false
BOOL AntialiasedLineEnable; // Default: false
} D3D11_RASTERIZER_DESC;

  这里大多数属性是高级用法或者很少使用, 我们这里重点说明前三个属性.

  FillMode: 决定光栅化时是使用网格模式( D3D11_FILL_WIREFRAME )还是正常的填充( D3D11_FILL_SOLID )

  CullMode: 决定剔除背面( D3D11_CULL_BACK )还是剔除正面( D3D11_CULL_FRONT )或者不进行剔除( D3D11_CULL_NONE )

  FrontCounterClockwise: 决定当三角形画到 render target 的时候, 顶点为顺时针时表示三角形的正面还是反面.


设置渲染状态

  在得到 ID3D11RasterizerState 之后, 我们可以通过 RSSetState 方法来把 ID3D11RasterizerState 设置给 D3D.

D3D11_RASTERIZER_DESC rsDesc;
ZeroMemory(&rsDesc, sizeof(D3D11_RASTERIZER_DESC));
rsDesc.FillMode = D3D11_FILL_SOLID;
rsDesc.CullMode = D3D11_CULL_NONE;
rsDesc.FrontCounterClockwise = false;
// 注意使用 ZeroMemory 时不为 0 或 false 的值需要重新设置.
rsDesc.DepthClipEnable = true;
HR(md3dDevice->CreateRasterizerState(&rsDesc, &mNoCullRS));

  另外, 通过传 0 给 RSSetState 方法可以重置所有状态.

  一般情况下, 程序都不需要再运行时创建新的状态集合, 所以程序可以在初始化阶段创建必要的渲染状态集合, 而且这些状态集合不应该被修改, 他们可以被设置为只读的属性. 比如将所有的渲染集合对象放到一个静态类里, 这样这些集合既不需要创建多份, 数据又可以被共享.

DirectX11笔记(十一)--Direct3D渲染7--RENDER STATES的更多相关文章

  1. DirectX11笔记(十)--Direct3D渲染6--PIXEL SHADER

    原文:DirectX11笔记(十)--Direct3D渲染6--PIXEL SHADER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u01033 ...

  2. DirectX11笔记(五)--Direct3D渲染1--VERTICES AND INPUT LAYOUTS

    原文:DirectX11笔记(五)--Direct3D渲染1--VERTICES AND INPUT LAYOUTS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.c ...

  3. DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS

    原文:DirectX11笔记(九)--Direct3D渲染5--CONSTANT BUFFERS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0 ...

  4. DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER

    原文:DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0103 ...

  5. DirectX11笔记(七)--Direct3D渲染3--INDICES AND INDEX BUFFERS

    原文:DirectX11笔记(七)--Direct3D渲染3--INDICES AND INDEX BUFFERS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...

  6. DirectX11笔记(六)--Direct3D渲染2--VERTEX BUFFER

    原文:DirectX11笔记(六)--Direct3D渲染2--VERTEX BUFFER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0103 ...

  7. DirectX11笔记(三)--Direct3D初始化2

    原文:DirectX11笔记(三)--Direct3D初始化2 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/article/ ...

  8. DirectX11笔记(二)--Direct3D初始化1之基本概念

    原文:DirectX11笔记(二)--Direct3D初始化1之基本概念 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/art ...

  9. DirectX11笔记(三)--Direct3D初始化代码

    原文:DirectX11笔记(三)--Direct3D初始化代码 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/article ...

随机推荐

  1. C#生成指定范围内的不重复随机数

    C#生成指定范围内的不重复随机数 // Number随机数个数 // minNum随机数下限 // maxNum随机数上限 public int[] GetRandomArray(int Number ...

  2. 操作系统 Lab1(2)

    中断很久,一看发现又多了一些内容. 打算完成了 Lab1 challenge 1 中断像量表设置的时候我们需要设置一个用于系统调用的 trap门 也就是 利用中断切换特权级 To kernel 调用 ...

  3. MFC 多屏显示

    概念 HMONITOR : 显示器句柄. 有效的显示器,该值不为空. 当WM_DISPLAYCHANGE 心消息发送的时候, 任何小时起都有可能被移除, 所以应用程序时刻检查全部的HMONITORS是 ...

  4. WINDOWS选择目录SHBrowseForFolder使用方法介绍

    首先介绍一个兼容Unicode和多字节的方法,定义如下头文件: // TString.h; #pragma once #include <string> #ifdef UNICODE ty ...

  5. CODE[VS]4633:Mz树链剖分练习

    Description 给定一棵结点数为n的树,初始点权均为0,有依次q个操作,每次操作有三个参数a,b,c,当a=1时,表示给b号结点到c号结点路径上的所有点(包括b,c,下同)权值都增加1,当a= ...

  6. 释放内存触发断点及数组、指针的NULL初始化

    Visual Studio调试时,出现“触发一个断点”内存释放出现异常 数组和对应指针的NULL初始化 数组使用之前要先对其初始化 char Outi[4] = { NULL }; char Outj ...

  7. 在sqlserver 的函数或存储过程中抛出异常(raiserror )

      raiserror的作用: raiserror 是用于抛出一个错误 其语法如下: RAISERROR ( { msg_id | msg_str | @local_variable } { ,sev ...

  8. 机器学习二 逻辑回归作业、逻辑回归(Logistic Regression)

    机器学习二 逻辑回归作业   作业在这,http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/hw2.pdf 是区分spam的. 57 ...

  9. js笔试-接收get请求参数

    请编写一个JavaScript函数,它的用途是接收url中get请求的参数,并返回为对象, 如: var url = “https://i.cnblogs.com/EditPosts.aspx?opt ...

  10. CentOS 6.5 usb安装

    我只说一下将CentOS安装作为服务器的情况,但是适用于普遍的CentOS安装过程,首先下载CentOS的安装镜像文件,有这么几种:CentOS-6.5-x86_64-LiveCD.CentOS-6. ...