这个教程沿用了D3D11纹理那节教程的架构,再次贴出来看看

其中这次:ModelClass

   int mScrrenWidth, mScrrenHeight;int mBitmapWidth, mBitmapHeight;

增加了这四个私有属性

先讲一讲WIN32的2D坐标系,WIN32的2D坐标系原点在窗口左上角

上图 大概绘制了一下

而D3D11的3D左手坐标系原点在窗口中心,

如图:

此时ModelClass提供了一个函数在每帧调用更新顶点缓存

bool ModelClass::UpdateBuffers(ID3D11DeviceContext* d3dDeviceContext, int positionX, int positionY)
{//在顶点缓存最原始的数据被改变了,属于动态顶点缓存(以前教程那些原始顶点数据虽然后面诚意变换矩阵,但是未曾改变原始数据)//如何渲染图片的位置未曾改变,就退出函数,这样可以节省大量处理if ((positionX == mPreviousPosX)&&(positionY == mPreviousPosY)){return true;}//如果改变渲染图片的位置改变了,就更新位置mPreviousPosX = positionX;mPreviousPosY = positionY;//求出win32坐标下图片的的left, right, top, bottom坐标,由WIN32坐标PosX和PosY变为D3D11坐标系float left, right, top, bottom;left = (float)((mScrrenWidth / 2) *-1) + (float)positionX;right = left + (float)mBitmapWidth;top = (float)(mScrrenHeight / 2) - (float)positionY;bottom = top - (float)mBitmapHeight;//创建临时的顶点数组Vertex *vertexs;vertexs = new Vertex[mVertexCount];if (!vertexs){return false;}//加载临时顶点数据,这些是DX11坐标,即屏幕中心为原点vertexs[0].pos = XMFLOAT3(left, top, 0.0f);vertexs[0].color = XMFLOAT2(0.0f, 0.0f);vertexs[1].pos = XMFLOAT3(right, bottom, 0.0f);vertexs[1].color = XMFLOAT2(1.0f, 1.0f);vertexs[2].pos = XMFLOAT3(left, bottom, 0.0f);vertexs[2].color = XMFLOAT2(0.0f, 1.0f);vertexs[3].pos = XMFLOAT3(left, top, 0.0f);vertexs[3].color = XMFLOAT2(0.0f, 0.0f);vertexs[4].pos = XMFLOAT3(right, top, 0.0f);vertexs[4].color = XMFLOAT2(1.0f, 0.0f);vertexs[5].pos = XMFLOAT3(right, bottom, 0.0f);vertexs[5].color = XMFLOAT2(1.0f, 1.0f);//锁定顶点缓存为了可以进行写入(动态缓存不能用UpdateSubResources写入)D3D11_MAPPED_SUBRESOURCE mappedResource;HR(d3dDeviceContext->Map(md3dVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource));//获取指向顶点缓存的指针Vertex* verticesPtr;verticesPtr = (Vertex*)mappedResource.pData;//把数据复制进顶点缓存memcpy(verticesPtr, (void*)vertexs, (sizeof(Vertex) * mVertexCount));//解锁顶点缓存d3dDeviceContext->Unmap(md3dVertexBuffer, 0);//释放顶点数组delete vertexs;vertexs = NULL;return true;
}

函数的形参为2D图片在WIN32坐标下的X和Y坐标,毕竟这样提供参数的进行2D贴图时候很直观,这点用过GDI的同学都很清楚

在该函数中将图片左上点的坐标由WIN32的2D坐标系空间转化为D3D11的左手3D坐标系空间的坐标,(Z都设为0.0f),由于算出了图片左上角的坐标,然后由图片的宽度,高度,屏幕宽度,屏幕高度,在算出图片其它三个点(左下点,右上点,右下点)在D3D11的左手3D坐标系的值,四个点刚好构成3D坐标系的一个正方形,由两个三角形构成,这样转化为6个顶点数据送入D3D11的顶点缓存,进行绘制,则进行2D Rendering成功.

当然这里有两个问题就是:第一是,D3D11的ViewMatrix得是mCamera位置为(0.0,0.0,X),其中X<0.0f,这样保证符合提供的形参和WIN32坐标系下观察的图片渲染位置效果一样

第二是,透视投影矩阵换为正交投影矩阵 orthoMatrix

运行的程序结果如下:、

mModel->Render(mD3D->GetDeviceContext(),400,300); //窗口宽800,高600,由WIN32坐标看就是在窗口中间

程序的源代链接如下:

点击打开链接

Directx11教程七之2D渲染相关推荐

  1. Directx11教程(65) 渲染到纹理

    通常情况下,我们的render target都是后缓冲,但也可以把render target设置为一个2d 纹理,然后再通过贴图的方式,把这个2d纹理显示出来,这样,就可以在一个屏幕上显示多个场景了. ...

  2. Directx11 教程(2) 基本的windows应用程序框架(2)

    Directx11 教程(2) 基本的windows应用程序框架(2) 原文:Directx11 教程(2) 基本的windows应用程序框架(2) 在本教程中,我们把前面一个教程的代码,进行封装.把 ...

  3. java 2d 绘图教程_Java标准教程:Java 2D绘图--第2章 从绘图开始

    Java标准教程:Java 2D绘图--第2章从绘图开始 Java 2D API是强大并且复杂的.然而,大多数Java 2D API只用到了封装在java.awt.Graphic类中的功能的自己.本节 ...

  4. CutJS – 用于 HTML5 游戏开发的 2D 渲染引擎

    CutJS 是轻量级的,快速的,基于 Canvas 开发的 HTML5  2D 渲染引擎,可以用于游戏开发.它是开源的,跨平台的,与现代的浏览器和移动设备兼容.CutJS 提供了一个类似 DOM 树的 ...

  5. java 2d绘图 stroke_Java标准教程:Java 2D绘图--第4章使用Text

    Java标准教程:Java 2D绘图--第4章使用Text 本节介绍文本API的用法,以及他们的渲染能力.至今为止,您已经有了基本的Java 2D文本API,同时知道如何设置字体和位置,以及绘制文本. ...

  6. Directx11教程39 纹理映射(9)

    Directx11教程39 纹理映射(9) 原文:Directx11教程39 纹理映射(9) 在myTutorialD3D11_32中,我们在PlaneModelClass中增加一个纹理Texture ...

  7. Directx11教程四十六之FBX SDK

    在之前的DX11入门系列文章中,有篇有关 Directx11教程四十之加载OBJ模型 读取obj模型数据的博客.不过在obj读取的那篇博客我有些坑并没有说,就是我写的那个obj解析器只能解析特定的ob ...

  8. Directx11教程(66) D3D11屏幕文本输出(1)

    在D3D10中,通过ID3DX10Font接口对象,我们可以方便的在屏幕上输出文字信息,一个DrawText函数就能解决所有问题,但在D3D11中个,这个变得超级麻烦,因为微软移除了Font接口,要在 ...

  9. Directx11教程三十一之ShadowMap(阴影贴图)之聚光灯光源成影

    这节教程我们将介绍一种生成Shadow(阴影)的主流技术,程序结构如下: 读懂此节教程你应该先懂得的技术:   (1)D3D11如何求得DepthBuffer(深度缓存值),D3D11教程二十五之De ...

最新文章

  1. ubuntu修改新增用户的目录_Ubuntu 18.04下创建新用户/目录、修改用户权限及删除用户的方法...
  2. TensorFlow2简单入门-加载及预处理文本
  3. 天气预报API接口城市代码(XML格式,信息大全)
  4. SVN - 简单使用手册
  5. 在ASP.NET CORE 2.0使用SignalR技术
  6. TypeError: missing 1 required keyword-only argument-python中的报错问题
  7. setInterval,setTimeout,clearInterval
  8. 【mysql】Filesort on too many rows解决方法
  9. [DB]MYSQL外键(Foreign Key)的使用(转载)
  10. 因子分析怎么计算权重?
  11. IntelliJ IDEA 中文语言包插件
  12. 计算机模拟超光速,超光速十代笔记本电脑怎么样-电脑测评
  13. 由于您的系统没有安装html help,win10遇到“您未安装FLASH控件”的提示怎么办
  14. Python智能语音机器人
  15. S3C2440 开发板实战(3):编译概念 + LED点亮闪烁
  16. python 实现贷款计算
  17. 2021年SIM卡交换攻击,美国损失近千万
  18. C++获取数组的长度
  19. 项目实训(十六)——总结
  20. 35.前端笔记-CSS3-3D转换

热门文章

  1. python 代码整体左移或右移
  2. HBuilder X问题记录
  3. # 2014年蓝桥杯真题CC++B组
  4. 顶刊数据:三批“智慧城市“”试点名单匹配。全国300直辖市地级市智慧城市试点、最早试点年份(2000-2021年)
  5. matlab gui更新结构体,Matlab GUI教程0x5 -handles结构体用法简介
  6. 奥义蛇皮走位之反复横跳(二)
  7. TRINAMIC静音步进驱动TMC2208模块的基本调试方法
  8. 计算机科学ESI 2020年7月,2020年7月ESI学科高水平论文134篇
  9. python云计算是什么意思_云计算是什么意思 什么是云计算
  10. 2021-04-24全国艺术设计专业院校分析——华南地区