SSAO 思路SSAO每一帧都将场景视图空间的最近可视点的Normal ,Depth渲染到全屏render target上。然后将render target作为输入计算屏幕上每个像素对应的环境光遮蔽。渲染Normal , Depth创建一张纹理贴图,将其作为RenderTarget格式为DXGI_FORAMT_R16G16B16A16_FLOAT RGB用于保存视图空间中的最近可视点的法线坐标。alpha通
SkyBox Sky天空是位于极远处的,因此我们将天空盒的深度值设置在远截面cbuffer Transform{float4x4 WorldViewProj;};struct VertexIn{float3 PosL : POSITION;};struct VertexOut{float4 PosH : SV_POSITION;float3 PosL : POSITION;};Ve
ShadowMap 创建阴影分为两步: 一:以光源为视点,正交投影渲染整个场景,得到深度图(shadow map)并保存变换矩阵。深度图中记录了以光源为视点时,所有的可视点的深度。 二:以相机为视点渲染场景,对于场景中的每个顶点,将其变换到以光源为视点的空间,若其深度大于shadow map中对应点的深度值,则说明光源射来的光线被物体遮蔽了。则该点处于阴影中由于光源发出的光是平行光,因此我们需要建立一个正交投影矩阵
Displacement Map Normal Map仅仅提升了光照细节,并没有提升图元细节,Normal Map仅仅只是一种光照技巧。 Displacement Map可以用于提升图元的细节。位移贴图配合细分可以极大的提升效果。 Displacement Map通过将顶点沿着法线方向的反方向进行偏移。 p′=p+s(h−1)p^\prime = p + s(h - 1) ss是缩放量,h∈(0,1)h \in (0 , 1
Normal Map 法线贴图是通过扰动法线来产生视觉上的凹凸感 法线贴图的每个像素保存了切线空间的坐标值 如图所示,T ,B , N构成了切线空间,法线贴图中记录的就是该空间中的坐标 然而我们的光照计算是在世界空间进行的,所以我们需要知道该点在世界空间中的法线坐标。 如图所示:假设三角形的三个点为V0V_0 , V1V_1 , V2V_2.对应的纹理坐标为(u0,v0u_0 , v_0) , (u1,v1u
Shader Stage Programmable StageVertex StageHull StageDomain StageGeometry StagePixel StageCompute StageFixed StageInput Assembler StageRasterizer StageStream Out StageOutput Merger Stage
Pipeline System - Shader Reflection Shader ReflectionShader的信息可以通过轮询ID3D11ShaderReflection接口获取,该接口也可以获取用于轮询Constant Buffer , Variable , Type信息的接口。通过D3DReflect()函数可以从shader获取其ID3D11ShaderReflection接口以下为从shader中获取ID3D11ShaderReflection的方法:
Parameter System 参数类型enum ParameterType{ // 数值 VECTOR , MATRIX , MATRIX_ARRAY , // 资源视图 SHADER_RESOURCE , UNORDERED_ACCESS , CBUFFER , SAMPLER , ENTITY}这些都是Shader中的各种参数RenderPa
Resource System 资源类型Resource分为以下几类:enum ResourceType{ // Buffer RT_VERTEXBUFFER = 0x010000, RT_INDEXBUFFER = 0x020000, RT_CONSTANTBUFFER = 0x030000, RT_STRUCTUREDBUFFER = 0x040000, RT_BYTEA
Ray Box求交点 Ray与Box的定义:class Ray{ // data member Vector3f Origin; Vector3f Direction;}class Box{ // data member Vector3f Center; float Extents[3]; Vector3f Axis[3];}Box可以看成由三组平面所构成的平
Ray Box 碰撞检测 Box采用OBB定义:enum AxisDefine{ X , Y , Z};// data member Vector3f Center;Vector3f Axis[3];float extent[3]; // 边长的一半Ray采用参数式Point=Origin+t∗Direction,0≤t≤∞Point = Origin + t * Directio
Ray Sphere 求交点 Ray:// data memberVector3f Origin;Vector3f Direction;设Ray的起点OriginOrigin为O(x0,y0,z0)O(x_0 , y_0 , z_0),DirectionDirection为D(dx,dy,dz)D(dx , dy , dz) ⎧⎩⎨x=x0+t∗dxy=y0+t∗dyz=z0+t∗dz \begin{equat
Ray Sphere 相交测试 Ray:// data memberVector3f Origin;Vector3f Direction;Sphere:// data memberVector3f Origin;float Radius;测试Ray Sphere是否相交: 球心为O , 光线的起点为A,以点A向球发射切线,设点B为切点 则当光线在图示的椎体中时,光线与球产生相交 在椎体之外,则无相交 并且当
视椎体提取 参考:fast extraction viewing frustum planes from world view projection matrix本文主要是记录下视椎体提取的主要方法首先假设我们有一个顶点v=(x,y,z,w=1)\mathbf{v} = (x , y , z , w = 1)和4x4矩阵M=(mij)\mathbf{M}=(m_{ij}),M\mathbf{M}是视图投影矩阵,
DirectX 11 填充二维纹理 最近写程序刚好需要将数据写到二维纹理中,然后显示出来看数据是否正确。以这个笔记小小的记载下 srand( 0 ); DirectX::XMFLOAT2 data[128 * 128]; for( int i = 0; i < 128 * 128; i++ ) { data[i].x = rand() / ( float )RAND_MAX;
位逆置变换 将数组int a[] = {0 , 1 , 2 , 3 , 4 , 5 , 6 , 7};进行位逆置变换变为{0 , 4 , 2 , 6 , 1 , 5 , 3 , 7};变换前二进制表示为:000 , 001 , 010 , 011 , 100 , 101 , 110 , 111变换后:000 , 100 , 010 , 110 , 001 , 101 , 011 , 111代码如下:#inclu
那些年的狗血bug-----shadow 看了Directx 11龙书中讲阴影的一章后,自己迫不及待的开始动手写~~ 于是噼里啪啦一阵之后,代码终于敲完了,于是开始了漫长的调试过程小问题不断不过也很好解决,很快Basic模式和Normal Map模式都能很好的运行~然而,Displacement Map模式下的阴影并非如此~~ 出现了如下的画面: 从图中可以发现,柱子的阴影不见了(好吧,从右下角的调试纹理中也能看出来~~ 于是乎,阴
VS生成后事件闲谈 之前写DirectX时,每次都是将shader编译后生成的文件放在$(ProjectDir)(ProjectDir) 然后再将生成的文件拷贝一份到$(OutDir)(OutDir)中,以便单独运行可执行文件时,可以正确加载shader但是这样太麻烦了~于是乎,想到了VS的生成后事件的功能。于是乎开始尝试下将Shader的生成文件名改为:$(ProjectDir)(ProjectDir)\CSO\%