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

2024-05-11 22:58

本文主要是介绍DirectX11笔记(二)--Direct3D初始化1之基本概念,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 纹理 Texture
  • 交换链 Swap Chain
  • 深度缓冲 Depth Buffer
  • 纹理资源视图 Texture Resourse View
  • 多重采样 Multisampling
  • 特征等级 Feature Level


纹理( Texture )

  2D纹理是一个数据元素的矩阵,2D纹理的一种使用场景是存储一张2D图片每一个像素的颜色,但是他一般都不只有这一种用途。在更高级的技术中,比如法线贴图(Normal Mapping),他还可以存储一个3D向量来表示法线信息,而不是存储颜色。纹理可以做很多事情,这些在以后会继续讨论, 但是需要注意,一个纹理只能按一种格式存储,这些格式由枚举值DXGI_FORMAT指定.

交换链( Swap Chain )

  为了避免渲染场景时的闪烁, 最好是将这一帧的所有内容先画到一张离屏的纹理上( back buffer ), 当一帧结束之后一次渲染到屏幕上, 这样观察者就只会看到完整的帧而不是一帧中各个成员的绘制过程. 为了实现这一过程, 硬件会维护两个buffer, 分别称为front bufferback buffer. front buffer存储正在画的帧, back buffer存储下一帧, 当back buffer准备完毕之后, back buffer和front buffer发生交换, 这个交换操作我们把它叫做presenting. presenting本身其实是一个效率很高的操作, 因为实际上它只是改变指针的指向.
swap chain

深度缓冲( Depth Buffer )

  深度缓冲便是纹理不存储图片数据的一种典型应用. 它存储了每一个像素的深度信息, 范围是0.0~1.0, 分别表示从最近到最远. 它的每一像素和back buffer是严格一一对应的.
  假设我们要按照圆柱体, 球体, 圆锥体的顺序进行渲染下图的场景. 深度缓冲的工作模式是: (back buffer一般会事先被清空, 深度缓冲全部是1.0表示最远)d3 < d = 1.0 深度测试通过, P = P3, d = d3; d1 < d 深度测试通过, P = P1, d = d1; d2 > d 深度测试失败不做处理. 最终我们得到像素P的颜色为P1.
深度缓冲
  深度缓冲帮助我们找到距离视点最近的像素点. 深度缓冲也是一张贴图, 它的格式也被DXGI_FORMAT指定, 注意一个应用可以不使用模板缓冲( stencil buffer ), 但使用时一般会和深度缓冲结合使用, 称为深度模板缓冲. 在一张32bits的纹理中, 深度缓冲占24bits, 模板缓冲占8bits.

纹理资源视图( Texture Resourse View )

  纹理可以通过设置特定的标记绑定到渲染管线的不同阶段, 比如作为render target和shader resource. 资源本身不会直接绑定到不同的阶段, 绑定到对应阶段的是资源视图. Direct3D要求我们在初始化阶段创建纹理资源视图, 如果要把一张纹理用作render target和shader resource便需要创建ID3D11RenderTargetView和ID3D11ShaderResourceView. 为了给资源创建特定的视图, 我们需要在创建资源时为资源绑定特定的标记. 比如为没有指定D3D11_BIND_DEPTH_STENCIL标记的资源创建ID3D11DepthStencilView视图将会报错.
  纹理资源视图一般被用于以下两点:
  告诉Direct3D如何使用这个资源
  当资源格式在创建时是无类型格式时, 在创建资源视图时就必须指定其类型. 因此对于无类型格式的纹理, 它的元素可能被视为浮点数或者整数.

多重采样( Multisampling )

  由于像素并不是绝对小的点, 所以在渲染斜线的时候必然出现阶梯状的锯齿, 这种缺陷会随着屏幕分辨率的提高减弱, 但通常不能无节制的提高分辨率, 所以我们会采取一些方法进行抗锯齿操作. 超级采样( Supersampling )便是其中的一种, 他使用两个四倍于原back buffer的纹理作为back buffer和depth buffer, 在提交back buffer之前, 用四个像素的平局值来计算一个像素. 实际上这是在软件层面提高分辨率.
  但是超级采样是极其昂贵的操作, 他相比原来使用了4倍的内存, pixel 处理也是4倍. 对此, Direct3D使用了一种相对妥协的方法: 多重采样抗锯齿. 假设我们使用4倍多重采样抗锯齿, 多重采样的还是需要4倍屏幕分辨率大小的纹理, 但是他不对每一个像素进行计算, 多重采样相较于超级采样节省在先进行位置判断, 这省去了对图形内部不会产生锯齿的像素的重复计算. 他只在边缘进行了类似于超级采样的处理, 减少了抗锯齿的消耗. 但需要注意的是多重采样并没有提升图形内部的画质, 超级采样依旧具有更好的效果, 只不过他也需要更强大的硬件支持.

特征等级( Feature Level )

  特征等级实际上就是Direct3D提供的一个枚举变量, 他严格的表示了当前的API等级, 我们在编程时应该注意设置特征等级, 一种好的做法是维护一个特征等级数组, API等级由高到低存储, 在用户的设备无法支持高版本API时能自动降低到低版本API.

这篇关于DirectX11笔记(二)--Direct3D初始化1之基本概念的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/980894

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓