x-2010
这个作者很懒,什么都没留下…
展开
-
Windows窗口的建立
Win10 VS2013 Win32 Release 创建一个空白应用工程d3dtest:输入如下代码:#include "stdafx.h"#include #include "Resource.h"LPCTSTR WndClassName = "firstwindow";HWND hwnd = NULL;const int Width = 800; //设置宽const i原创 2017-09-22 16:51:13 · 596 阅读 · 0 评论 -
创建一个D3D11应用程序流程
1.是一个COM接口的对象,交换链SwapChain,用来切换前后缓冲。也就是所谓的双缓冲,当渲染场景时,是渲染到后缓冲的,因此当呈现后缓冲到显示器时,它会完整地被画出来。若不使用这种方式,就会看到扫描线,就是看到程序在绘画场景时的样子,通常是从上到下的。2.是一个用来表示硬件设备(GPU)的接口。随后,就是directX11的新接口,ID3D11Device接口,它分为两部分,用来支持新的多原创 2017-09-22 16:58:28 · 1963 阅读 · 0 评论 -
D3D管线以及着色器工作原理-画一个三角形
D3D11的10个渲染管线阶段:1.输入装配阶段(IA:Input Assembler Stage)2.顶点着色阶段(VS:Vertex Shader Stage)3.外壳着色阶段(HS:Hull Shader Stage)4.细分着色阶段(TS:Tesselator Shader Stage)5.域着色阶段(DS:Domain Shader Stage)6.几何着色阶段(原创 2017-09-25 16:58:33 · 1970 阅读 · 3 评论 -
D3D11的颜色处理
怎样通过修改着色器,顶点结构,以及输入布局来包含颜色。为每个顶点指定的颜色将会插值贯穿到三角形中。这儿会在顶点结构中包含四个额外的浮点型用来定义顶点颜色。如果在顶点级别指定了颜色,在光栅化RS阶段会将这些颜色插值到整个三角形的像素中去。仍然不需要在像素着色器中做任何的计算,因为RS将会做这个计算。效果文件效果文件,创建顶点和像素着色器的地方。首先创建一个新的结构体。该结构体将会VS的返原创 2017-09-26 16:23:37 · 1252 阅读 · 0 评论 -
D3D索引缓冲 - 画一个矩形
索引可以定义如何绘制几何体。比如,通过创建三角形来画一个四边形,每个三角形需要3个顶点,总共就需要6个顶点来创建一个四边形。若使用索引缓冲,则只需要4个顶点就可创建一个四边形。索引列表中第一个三角形的顶点为(0,1,2),第二个为(0,2,3)。一个索引列表通常是一个三角形列表。它们对绘制几何体是非常有用的,它们还能够保存顶点数。在加载模型时也是非常有用的。索引:若想要绘制一个四边形,原创 2017-09-27 09:39:29 · 3127 阅读 · 1 评论 -
D3D11的深度模板缓冲
创建深度模板缓冲,随后创建深度模板视图并将它绑定到管线的OM阶段。绑定深度模板视图到OM阶段将会运行它检测渲染目标上的每个像素片段的深度值。若在渲染目标上的点内有不止一个像素片段,深度值最低的像素(离屏幕最近)片段将会绘制,而其他的会被丢弃。实现一个深度模板缓冲对于directx中渲染3D场景来说是必备的。深度模板视图深度模板视图就是让管线的OM阶段检测渲染目标上所有的像素片段原创 2017-09-27 11:35:54 · 2336 阅读 · 1 评论 -
D3D11世界空间,观察空间和模型空间(静态摄像头)
这里会介绍3D 世界中的世界,视图,以及本地空间,这些能够让人创建一个摄像头,因此只有摄像头看到的东西才会被绘制到屏幕上。这儿将会介绍如何实现一个静态(非动态的)摄像头,以及如何与一个着色器常量缓冲发生作用,着色器常量缓冲是一些位于着色效果文件中的变量,这些变量可以在代码中进行更新。将会学习3D世界中的不同空间,它们由世界,视图,投影,本地以及屏幕空间组成。可使用这些空间来创建一个相机原创 2017-09-27 14:13:17 · 2990 阅读 · 1 评论 -
d3d11的转换-两个立方体发生旋转
这儿介绍在3D场景中如何转换一个几何体。转换利用矩阵,使用xna数学库提供的函数来实现。转换在d3d中使用4x4的矩阵来做转换。这是因为它们使用4维度,3空间,x,y,z和1个变化,这1个变化是用字母w表示,w一般为0或1.当想要转换一个物体时,获取它的3D向量,v=[x,y,z],将w添加进去,因此就能够被4x4的矩阵乘了,所以它看起来像v=[x,y,z,1]。将w设为1,那就意原创 2017-09-27 17:29:26 · 1350 阅读 · 0 评论 -
D3D11 渲染状态
这儿是在上一个博客基础上修改转换代码。在D3D中,物体都是停留在当前状态中的,没有物体会回退到它的“默认”状态。比如图元拓扑,一旦设置了它,就像之前在一个三角形列表中所做的一样,除非显式的去改变它,否则它就会一直停留在三角形列表中。就像顶点和索引缓冲,一旦将它们绑定到管线,除非去改变它们,否则它们就会一直停留在那儿。这儿,将说到的是渲染状态。渲染状态所做的就是封装能够用来配置d3d的设置。有不同状原创 2017-09-28 08:39:40 · 4264 阅读 · 0 评论 -
D3D11的纹理
下面介绍的是如何从一个文件加载一个纹理并把它贴到结合体上面在这儿通过顶点定义每个三角形。尽管这会添加更多的代码用来创建盒子和顶点结构体,但是它在纹理贴图时会更容易。在D3D中,使用一个2D(U,V)坐标系来将纹理贴到对象上面。U轴水平地运行到图像,V轴是垂直运行的,U范围是0~1(0是图像的起始处,1是图像的结尾处),因此图像的水平长度的一半就是0.5,即使真实图像长度为256个像素也是如原创 2017-09-28 09:39:16 · 1523 阅读 · 0 评论 -
D3D11的混合
现在要学习到的是混合技术,可让人知道怎么去渲染一个透明图元。这是在上一个博客的纹理代码中添加的,最终效果会看到两个盒子看起来像是弄脏了的玻璃。还要知道的一件事情就是当渲染透明物体时,有时它们是相互透明的,有时它们又不完全是相互透明的。这儿将实现一个混合效果让图元看起来像是透明的,还会遇到一个问题就是当渲染一个以上透明图元时,有时它显示透明但又有时显示不透明,或至少对后面的物体来原创 2017-09-28 13:42:03 · 748 阅读 · 0 评论 -
D3D11的像素裁剪
本篇将如何快速有效的裁剪绘制到屏幕上的像素。如果α值接近0时,如何使用着色器文件中的clip()函数来阻止处理当前像素。一个使用clip函数的实例:clip(alpha - .25);如果α值小于等于0.25时,将会对像素进行裁剪。clip函数的工作方式就是如果值小于等于0时,它就会彻底阻止像素着色器进一步的处理,且没有数据会写入到渲染目标或这深度模板缓冲中。全原创 2017-09-28 16:38:42 · 1040 阅读 · 0 评论 -
D3D11的简单字体
本篇的任务是要先学会混合和纹理才能够做到的。这儿有几种方法能够在D3D11中实现字体显示,一个是学会使用微软想要我们使用的两个新的API,Direct2D和DirectWrite,原因是实际上它们是很有用处的且非常酷,暂不去提它们的灵活性了(除了不能够使用D3D11设备直接使用它们这点之外),它的缺点就是 由于不能够在D3D11中直接使用它们,需要在D3D10.1的设备中使用它们,所以在渲染时原创 2017-09-28 17:59:57 · 2022 阅读 · 0 评论 -
D3D 11高分辨率定时器
本章,使用三个函数方法来学习如何制作一个高分辨率的定时器,用于确保场景中的每个运动物体的速度值基于时间进行更新。这意味着无论我们的帧率是多少,一个物体在场景中移动每秒会走过同样的距离,物体所移动的距离或者它所旋转的多少都是基于时间的,而不是fps。这儿会学会如何使用方法QueryPerformanceCounter()和QueryPerformanceTimer()来实现高分辨率的游戏定时器,原创 2017-10-16 11:49:20 · 593 阅读 · 0 评论 -
D3D11 简单光照
有四种类型光照以及三种光源。本章将介绍使用一个“定向”光源如何实现简单光照。在随后的章节会介绍其他两种类型的光源和镜面光照。光照对于视频游戏的真实外观和感觉是非常重要的。由于固定功能管线从directx10中删除了,因此现在需要人工实现光照了。一般地,光照模型越精确,计算量就越大以及越复杂。在视频游戏中,在保持游戏运行在30fps及以上同时,需要找到一种方式来实现光照。当为一个电影做场景模原创 2017-10-16 16:21:33 · 751 阅读 · 0 评论 -
D3D11 点光源
本章节会讲解如何创建一个简单的点光源,它会获取第一个立方的位置并绕着第二个立方体中心旋转。点光源是定向光源的一个进步,意味着它要进行更多的计算,以及更真实的场景。点光源因子当创建一个点光源时要声明一对值。要定义它 位置,范围以及衰减位置它由一个叫pos的3d向量组成,第一个值为x轴,第二个为y轴,第三个为z轴。但是点光源没有像定向光源和聚光灯一样的一个方向。由于它是向各个方向发原创 2017-10-19 10:31:00 · 796 阅读 · 0 评论 -
D3D11 输入
本章节将介绍如何从用户直接获取输入数据,比如键盘,鼠标甚至手柄。将学习如何实现Direct输入。主要是使用Direct输入API,或许你会疑惑为什么我们不使用Win32的API来获取用户输入,毕竟,它能够找到键盘上的哪一个值被按下,以及从鼠标甚至手柄获取输入数据,然而,Win32 API设计初衷是为键盘入口程序服务的,不是为需要速度的实时输入服务的。当从Win32 API获取输入时,它必须处理原创 2017-10-19 11:40:03 · 1028 阅读 · 0 评论 -
D3D11 第一人称相机
本章节将介绍如何实现一个第一人称的向量相机,看起来好像是你正在到处走动。还会学习如何全屏并退出时在不会出错。在本章会学习如何实现一个简单的第一人称相机,可以使我们通过鼠标向上,向下,向左,向右看,或往前后左右哦移动。不是很难。这儿我们将会使用一张无缝草的纹理来使得地面纹理带草。全局声明这儿会有一大批新的声明变量。可看到有四个新向量,两个新矩阵,以及一对浮点值。前面两个向量表示世界中原创 2017-10-19 15:13:02 · 1012 阅读 · 2 评论 -
D3D11 立方体贴图(天空盒子)
本章将学习如何使用一个3D纹理来纹理化一个半圆形。这种技术叫做立方体贴图,且我们将使用该技术来学会如何制作一个天空盒子。立方体贴图通常用于创建一个无限远的环境,比如天空。我们能够使用该技术通过加载一个3D纹理来创建一个天空盒子,并使用该3D图片来纹理化一个半圆并环绕相机。为了让这种错觉持续,天空盒子必须总是以相机为中心环绕,因此我们无论往哪个方向移动多远,我们都不会接近天空盒子。另外一件事就是原创 2017-10-19 17:04:40 · 5281 阅读 · 0 评论 -
D3D11 聚光灯
本章学习如何实现一个聚光灯,让人用起来就像是镁光灯一样。由于聚光灯一般仅仅一个方向上的点光源,所以我们可以直接从点光源来构建代码。本章节是基于第一人称相机来构建的。我们将给相机使用这个聚光灯。聚光灯因子聚光灯因子一般仅仅只是点光源附带一个方向而已。因此,我们会直接基于点光源的实现来构建,只在它的基础上添加一个方向,以及用一个值表示我们的聚光灯的椎体大小。方向在我们的代码中用一个原创 2017-10-19 20:15:48 · 788 阅读 · 0 评论 -
D3D11 加载静态3D模型(.obj格式)
本章节将学习如何从.obj文件加载静态3D模型。通常在游戏内不会想要使用.obj文件,因为它们不包含动画,且它们是ascii格式的,所以它会比其他格式的文件比如.3ds的要大一些,但是这是一个用于学习如何加载模型的好起点。本章基于聚光灯构建。和.obj文件一起的是.mtl文件,它是一个材质库。还会学习使用.mtl文件来为模型加载材质。.obj文件很大并且没有包含动画,所以通常会想要给游戏使用一个不同的模型格式。然而,.obj格式是一个学习如何加载模型的很好的文件。.obj文件格式.obj格式文件已经原创 2017-10-19 20:56:29 · 2712 阅读 · 0 评论 -
D3D11 法线贴图(凹凸贴图)
本章我们将学习如何让一张平坦的纹理表面具有深度的感觉。该技术叫做法线贴图。我们是基于前面那个章节来构建的,加载obj模型的那个章节。但是并并不会使用那个模型,我们会使用一个更简单的模型,它会位于地面,上面用草地纹理。这儿将实现一种技术叫做法线映射。所做的事情就是让我们平坦纹理在使能光线时,看起来是凹凸感或者有深度感。该技术通过使用指定给每个像素的法线来生效,而不是使用指定给每个顶点的法线,然后被插值到整个表面。该技术非常简单,但是为了实现该结束,我们必须使用叫做Texture,或Tangent空间(和世界原创 2017-10-20 18:30:31 · 4028 阅读 · 0 评论 -
D3D11 拾取
本章节是基于法线贴图章节的。这儿我们将学习如何将2d屏幕位置(以像素为单位),也就是鼠标所在的位置,转换为世界空间中的3d射线。然后我们会检测看下是否会和屏幕上的其他物体相交。(本例中假设物体是瓶子)。如果射线和任何瓶子相交,则我们会显示相机到瓶子的距离,增加分数,且如果射线再次拾取它,则删除瓶子不再显示和不再被检测。本章节介绍如何在Direct3D 11中拾取物体。在D3D11中原创 2017-10-21 10:30:24 · 1302 阅读 · 0 评论 -
D3D11 包围体
若场景中有上千个模型,并且每个模型有上千个三角形。若仅仅使用前一章节中的拾取方法,则完成一个拾取操作将耗时5s。在单一帧内耗时5s是让人难以接受的,因此引进了包围体方式。这里讲学习如何创建以及使用边界盒子以及边界球。边界盒子比边界球跟更为精确,但是耗时比边界球多。这里会使用之前学习过的高分辨率定时器来计算每次拾取操作的耗时。介绍:边界体用于加速类似拾取与碰撞测试操作。本章会原创 2017-12-13 18:49:25 · 546 阅读 · 0 评论 -
D3D11 包围体碰撞检测
本章节介绍如何检测两个对象之间的碰撞。将会介绍如何使用对象的包围体而非对象本身来做碰撞检测,因为这会比检测三角形与三角形的碰撞要更为简单快速。本章会构建一座由瓶子组成的金字塔,当鼠标点击屏幕时会扔出一个瓶子,若扔出的瓶子碰撞到金字塔上一个或更多瓶子时时,则扔出去的瓶子和被碰撞的瓶子都会消失,同时增加分数。简介本章是通过包围体来做两个对象之间的碰撞检测,这里会在包围球和包围盒碰撞测试之间切换。包围盒碰撞测试针对细长形对象更为准确。若是测试两个没有任何凸起的对象之间的碰撞,包围球会更为准确。这两种方式都原创 2017-12-14 16:28:00 · 1279 阅读 · 0 评论 -
D3D11 MD5骨骼动画模型的加载
MD5模型由两个文件组成:md5mesh和md5anim文件,正如名字所示,一个用于加载md5模型,一个用于动画。本章节介绍的是如何从md5mesh文件加载md5骨骼动画模型以及如何基于骨骼布局来设置顶点位置。本章会介绍如下点:1.md5mesh格式2.四元素概念3.骨骼是怎样在蒙皮模型上工作的简介:由于静态的obj格式不存储动画,所以就选择了MD5格式来做这件事。虽然可以用obj格式来做混合帧动画,但对需要细致效果时,会需要很多的关键帧,而每帧都添加相同的顶点,这很消耗内存。M原创 2017-12-15 16:45:34 · 1154 阅读 · 0 评论 -
D3D11 骨骼动画(基于MD5格式)
MD5格式利用了骨骼系统(也称为关节系统)来做动画效果,因此在本章节会介绍如何遍历存储在md5anim文件中的动画以及如何将动画应用在模型上。骨骼系统(也称为关节系统)优点在于比直接存储关键帧动画要占用更少的内存,因为关键帧动画相当于给每个动画帧赋予一个全新的模型,而关节系统仅仅在每帧存储骨头的方向以及位置信息。简介:在上一章节介绍了加载md5模型,并使用骨骼系统计算顶点位置和法线。在本章原创 2017-12-19 14:07:44 · 1629 阅读 · 0 评论 -
D3D11 自由视角相机
本章节将介绍通过改变相机函数来将第一人称相机切换到自由视角相机,是基于前面第一人称相机章节来实现的。简介:实际上在前面骨骼章节是已经有用到自由视角的,这里单独拿出来介绍,基于第一人称相机章节来介绍:注释掉了五行代码,并添加了三行。在这三行代码中得到自由视角相机,要得到自由视觉相机就是能够在三个维度(x,y,z)上向前,向后,向左和向右移动,而第一人称只能在两个维度上(x,z)上移动。本章节与第一人称章节的区别就是,第一人称创建新的旋转矩阵只绕着y轴去移动相机,自由视角使用用来更新目标向量的同样的原创 2017-12-22 10:38:46 · 985 阅读 · 0 评论 -
D3D11 高度图(地形图)
本章将介绍如何导入一张灰度bmp图作为高度图,本章基于自由视角相机章节来介绍的。简介:本章会创建一个函数来导入一张bmp格式的灰度图(每个纹理元素的RGB通道都一样),同时在高度图中使用纹理元素内R通道的值来定义每个顶点的高度。这里使用PS工具内的漫反射云彩过滤器创建的高度图,但是效果不是很好,可看到有很多的尖峰。最好是用专门制作高度图的软件来做。包含向量头文件这里要包含向量头文件以便可使用向量,它是一个动态数组用于创建格子或地形。#include <vector>新的全局变量原创 2017-12-22 13:35:17 · 3145 阅读 · 0 评论