Directx11教程(65) 渲染到纹理
通常情况下,我们的render target都是后缓冲,但也可以把render target设置为一个2d 纹理,然后再通过贴图的方式,把这个2d纹理显示出来,这样,就可以在一个屏幕上显示多个场景了。
本教程中,我们在myTutorialD3D11_59的基础上,来实现渲染到纹理的效果。
首先,创建一个rendertextureclass,这个类中,我们创建一个2d纹理,并把这个2d纹理设置为render target,并有一个m_shaderResourceView对象,通过这个对象,我们就可以访问这个2d纹理,后面的2d渲染就是通过这个对象,来实现纹理操作的。
rendertexture类很简单,主要的变量和函数为:
class RenderTextureClass
{
public:
RenderTextureClass();
RenderTextureClass(const RenderTextureClass&);
~RenderTextureClass();
bool Initialize(ID3D11Device*, int, int);
void Shutdown();
void SetRenderTarget(ID3D11DeviceContext*, ID3D11DepthStencilView*);
void ClearRenderTarget(ID3D11DeviceContext*, ID3D11DepthStencilView*, float, float, float, float);
ID3D11ShaderResourceView* GetShaderResourceView();
private:
ID3D11Texture2D* m_renderTargetTexture; //渲染目标视图
ID3D11RenderTargetView* m_renderTargetView;
ID3D11ShaderResourceView* m_shaderResourceView; //shader资源
};
接着,我们要创建一个debugwindowclass类,这个类用于在屏幕上显示一个小窗口,把一些常用的信息放在这个窗口类。这个类使用2d渲染,就是传入的投影矩阵,非透视投影矩阵,而是平行投影矩阵。在D3CClass中,我们通过m_D3D->GetOrthoMatrix(orthoMatrix);得到平行投影矩阵。该类通过画两个三角形,构成一个矩形,然后通过纹理贴出方式,把传入的纹理在该矩形框中显示出来。
该类使用textureshaderclass进行渲染,使用的shader文件为texture.vs和texture.ps。
在graphicsClass中,我们渲染场景的代码有所改变,要渲染场景2个pass,第一个pass,改变render target,把场景渲染到纹理中。第二个pass正常渲染场景,最后再通过debugwindowclass把第一个pass中产生的纹理通过贴图的方式显示出来。主要的代码如下:
bool GraphicsClass::Frame(float dt)
{
D3DXMATRIX worldMatrix, viewMatrix, orthoMatrix;
bool result;
// 把场景渲染到纹理中
result = RenderToTexture(dt);
if(!result)
{
return false;
}
// 清除渲染背景.
m_D3D->BeginScene(0.0f, 0.0f, 0.0f, 1.0f);
// 调用Render函数,渲染3D场景
// Render是GraphicsClass的私有函数.
result = Render(dt);
if(!result)
{
return false;
}
// 关掉zbuffer,开始2d渲染.
m_D3D->TurnZBufferOff();
// 得到世界,视图以及正交投影矩阵
D3DXMatrixIdentity(&worldMatrix);
m_Camera->getViewMatrix(&viewMatrix);
m_D3D->GetOrthoMatrix(orthoMatrix);
// 准备debug小窗口的顶点缓冲.
result = m_DebugWindow->Render(m_D3D->GetDeviceContext(), 20, 10);
if(!result)
{
return false;
}
// 用纹理shader渲染debug小窗口,把前面渲染到纹理的场景用过贴图,贴在小窗口.
result = m_TextureShader->Render(m_D3D->GetDeviceContext(), m_DebugWindow->GetIndexCount(), worldMatrix, viewMatrix,
orthoMatrix, m_RenderTexture->GetShaderResourceView());
if(!result)
{
return false;
}
// 打开z buffer
m_D3D->TurnZBufferOn();
// 把渲染的场景present到屏幕
m_D3D->EndScene();
return true;
}
程序执行后的界面如下:
完整的代码请参考:
工程文件myTutorialD3D11_62
代码下载:
稍后提供
Directx11教程(65) 渲染到纹理的更多相关文章
- NeHe OpenGL教程 第三十六课:从渲染到纹理
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Directx11教程(67) 显示模型文件
原文:Directx11教程(67) 显示模型文件 在前面的教程中,我们都是通过在ModelClass中直接产生顶点和索引数据,简单的三角形,立方体等等还好说,毕竟比较简单,如何显示复杂的 ...
- Directx11教程(66) D3D11屏幕文本输出(1)
原文:Directx11教程(66) D3D11屏幕文本输出(1) 在D3D10中,通过ID3DX10Font接口对象,我们可以方便的在屏幕上输出文字信息,一个DrawText函数就能解决所 ...
- Directx11教程(57) 环境映射
原文:Directx11教程(57) 环境映射 建好skydome后,如果我们想让其中的某个物体,比如那个球体来映射出周围环境的蓝天白云(不包括自己附近的物体),该怎么做呢?此时可以把这个 ...
- Directx11教程(56) 建立一个skydome
原文:Directx11教程(56) 建立一个skydome 本章建立一个skydome(天空穹),主要学习如何使用cube mapping. cube map就是把六张纹理当作 ...
- Directx11教程(54) 简单的基于GS的billboard实现
原文:Directx11教程(54) 简单的基于GS的billboard实现 本章我们用一个billboard的实现来学习D3D11中的GS. 在VS shader中,我们输入的是顶点 ...
- Directx11教程(52) 实例(instancing)的简单应用
原文:Directx11教程(52) 实例(instancing)的简单应用 有些时候,我们需要在场景中渲染大量的重复的物体,比如体育场中的观众,森林里面的树木等等,这些物体具有相似的形状,比如很多树 ...
- Directx11教程(51) 简单的billboard
原文:Directx11教程(51) 简单的billboard billboard称作公告板,通常用一个quad(四边形)表示[有的billboard用两个正交的quad表示],它的特点 ...
- Directx11教程(49) stencil的应用-镜面反射
原文:Directx11教程(49) stencil的应用-镜面反射 本教程中,我们利用stencil来实现一个镜面反射效果. 1.首先我们要在D3DClass中增加几个成员变量及函数. I ...
随机推荐
- Nodejs Express目录结构
原文 http://www.leixuesong.cn/1508 Express是一个基于Node.js平台的极简.灵活的web应用开发框架.在前面我们已经详细介绍了Express的安装,下面详细讲 ...
- springboot核心技术(三)-----web开发
web开发 1.简介 使用SpringBoot: 1).创建SpringBoot应用,选中我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运 ...
- 166 链表倒数第n个结点
原题网址:https://www.lintcode.com/problem/nth-to-last-node-in-list/description 描述 找到单链表倒数第n个节点,保证链表中节点的最 ...
- MyBatis配置文件(二)--settings配置
settings是MyBatis中最复杂的配置,它能影响MyBatis底层的运行,大部分情况下使用默认值,只需要修改一些常用的规则即可.常用规则有自动映射.驼峰命名映射.级联规则.是否启动缓存.执行器 ...
- combobox 的onLoadSuccess执行两次解决办法和 取值赋值
加红色字部分 jsp <input class="easyui-combobox" id="keshi" name="keshi" v ...
- Python之路,Day1 - Python基础1(转载Alex)
本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...
- js 之 call 、 apply
在学习js过程中怎么也绕不过用到call.apply方法,感觉都差不多,现在看看他们的用法,区别 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(conte ...
- 文件内容操作命令 cat、more、less、head、tail、wc、grep 命令详情
文件内容操作命令 cat.more.less.head.tail.wc.grep 命令详情 1) cat命令 用途:显示出文件的全部内容 格式:cat 目标文件 例: ...
- Luogu P3254 圆桌问题(最大流)
P3254 圆桌问题 题面 题目描述 假设有来自 \(m\) 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 \(r_i (i =1,2,--,m)\) . 会议餐厅共有 \(n\) 张餐桌 ...
- 专访阿里云资深技术专家黄省江:中国SaaS公司的成功之路
笔者采访中国SaaS厂商10多年,深感面对获客成本巨大.产品技术与功能成熟度不足.项目经营模式难以大规模复制.客户观念有待转变等诸多挑战,很多中国SaaS公司的经营状况都不容乐观. 7月26日,阿里云 ...