设为首页 加入收藏

TOP

(Visual C++)游戏开发笔记二十七 Direct3D 11入门级知识介绍 (五)
2014-11-23 19:38:16 】 浏览:633
Tags:Visual 游戏 开发 笔记 二十七 Direct3D 入门 知识 介绍
最小和最大值。


代码段5 全屏视口的创建和设置


[cpp]
D3D11_VIEWPORT viewport;
viewport.Width = static_cast(width);
viewport.Height = static_cast(height);
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;
viewport.TopLeftX = 0.0f;
viewport.TopLeftY = 0.0f;
d3dContext_->RSSetViewports( 1, &viewport );
D3D11_VIEWPORT viewport;
viewport.Width = static_cast(width);
viewport.Height = static_cast(height);
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;
viewport.TopLeftX = 0.0f;
viewport.TopLeftY = 0.0f;
d3dContext_->RSSetViewports( 1, &viewport );

六、清除与显示屏
渲染到屏幕需要几个不同的步骤。第一步通常是清除相关渲染目标的表面。在大部分游戏中这一步包含了深度缓存等一系列内容。在下一节即将呈现的demo中我们将在本章稍后实施,我们将清除渲染目标视图的颜色缓冲区到一种特定的颜色。这由调用D3D中的ClearRenderTargetView函数来完成。ClearRenderTargetView拥有如下的函数原型:

[cpp]
void ClearRenderTargetView( ID3D11RenderTargetView*pRenderTargetView,
const FLOAT ColorRGBA[4] );
void ClearRenderTargetView( ID3D11RenderTargetView*pRenderTargetView,
const FLOAT ColorRGBA[4] );


注:目前的大部分商业游戏中在渲染之前清除颜色缓存并不是必须的,因为像天空这样的环境图形要确保每个像素都会被颜色缓存所覆盖着。

ClearRenderTargetView函数以将被清理的渲染目标视图作为其变量。为了清除屏幕,我们设定某种颜色作为我们需要的背景阴影的颜色。这种颜色可以是红色,绿色,蓝色,和透明色Alpha数组中任意指定的0.0到1.0之间的颜色。这里0.0表示强度为0,而1.0表示完全饱满的强度。若对应于字节,1.0对应255。如果为红绿蓝颜色组合都为1.0,则会得到纯白的颜色。下一步就是绘制场景的几何形状了,最后一步是调用交换链的Present函数在屏幕上显示渲染缓冲区的内容。

Present函数具有以下的声明:

[cpp]
HRESULT IDXGISwapChain::Present( UINT SyncInterval, UINT Flags);
HRESULT IDXGISwapChain::Present( UINT SyncInterval, UINT Flags);

对Present函数的参数一个简单的理解:syncinterval 同步间隔,

flags 演示的标志。

在第n个垂直空白之后,Syncinterval能被设置为0,1,2,3,4来显示。垂直空白是当前帧的最后一列更新时间与下一帧的第一列更新时间的时间差。像电脑显示器这样的设备显示更新像素为垂直的,一列一列进行更新的。

Present函数的flags值可被设为0,表示输出到每一个缓冲区,设为DXGI_PRESENT_ TEST时则表示测试时不进行输出,或为DXGI_PRESENT_DO_ NOT_SEQUENCE表示不进行排序地利用垂直空白同步输出来显示输出。为达到预期的目的,我们可以只是传递0到Present函数来显示我们的渲染结果。

代码段五 展示了一个清屏和显示视图的例子。在后面我们将深入探究颜色缓存,深度存,使画面流畅无比的双缓冲等等。


代码段6 清除渲染目标然后显示显得渲染场景
[cpp]
float clearColor[4] = { 0.0f, 0.0f, 0.25f, 1.0f };
d3dContext_->ClearRenderTargetView( backBufferTarget_,clearColor );
swapChain_->Present( 0, 0 );

float clearColor[4] = { 0.0f, 0.0f, 0.25f, 1.0f };
d3dContext_->ClearRenderTargetView( backBufferTarget_,clearColor );
swapChain_->Present( 0, 0 );

七、关于格式
有时候我们需要创建指定的DXGI格式。格式可以用于描述一张图像的布局,每种颜色的位数,或者顶点缓存的布局(后面会讲到)。大多数情况下,DXGI格式用于描述交换链中的顶点布局。

举个例子,DXGI_FORMAT_R8G8B8A8_UNORM,它表示我们定义的每一个RGBA组成部分的数据都为8位。

没指名类型的格式我们称作无类型格式(typeless formats)。他们为每个部分保存相同的位数,但是并不注重包含了什么类型的数据。如DXGI_FORMAT_R32G32B32A32_TYPELESS。在常用的清单类型在下面中列出了。

常用的数据格式类型清单:


DXGI_FORMAT_R32G32B32A32_TYPELESS 128位RGBA无类型格式

DXGI_FORMAT_R32G32B32A32_FLOAT 128位RGBA浮点型格式

DXGI_FORMAT_R32G32B32A32_UINT 128位RGBA无符号整型格式

DXGI_FORMAT_R32G32B32A32_SINT 128位RGBA带符号整型格式
DXGI_FORMAT_R8G8B8A8_TYPELESS 32位RGBA无类型格式

DXGI_FORMAT_R8G8B8A8_UINT 32位RGBA无符号整型格式

DXGI_FORMAT_R8G8B8A8_SINT 32位RGBA带符号整型格式

当定义顶点格式的时候,比如DXGI_FORMAT_R32G32B32_FLOAT格式,就是说RGB值都支持是32位的数据类型。有时候,我们会看到特殊的为每一部分指定相同位数的格式,但是他们有不同的扩展名。

举个例子,DXGI_FORMAT_R32G32B32A32_FLOAT 和DXGI_FORMAT_R32G32B32A32_UINT类型的各个部分的位数都是相同的,不同的各个位数上一个是32位的浮点型,一个是32位的无符号整型。

八、 善后工作
Direct3D应用程序中要做的最后一件事情,就是清除和释放我们创建的对象。举个例子,在应用程序开头,我们要创建一个D3D的设备,一个D3D的渲染上下文,一个交换链,以及一个要渲染的目标。当这个应用程序关闭的时候,我们需要释放这些对象,以将这些资源返还给系统

COM对象保持一个引用计数,告知系统什么时候从内存中移除这些对象

首页 上一页 2 3 4 5 下一页 尾页 5/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇基于VC++实现PE的修改编程 下一篇VC中将控件保存成图片&&VC中利用G..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目