创建深度模板缓冲,随后创建深度模板视图并将它绑定到管线的OM阶段。绑定深度模板视图到OM阶段将会运行它检测渲染目标上的每个像素片段的深度值。若在渲染目标上的点内有不止一个像素片段,深度值最低的像素(离屏幕最近)片段将会绘制,而其他的会被丢弃。

实现一个深度模板缓冲对于directx中渲染3D场景来说是必备的。

深度模板视图

深度模板视图就是让管线的OM阶段检测渲染目标上所有的像素片段的深度模板值。一个像素片段就是一个具有写到屏幕上的潜在可能性的像素。比如一个球和一个盒子。球位于盒子后面,当它们通过渲染管线时,球的像素与盒子的像素都会倍放入到渲染目标上。这些像素就是所谓的像素片段。当像素到达OM阶段时,OM阶段回将像素片段的深度值与已经存储在位置中的像素片段进行对比。若新来的像素片段深度值小于已经保存的像素片段值,那么已经保存的像素片段值会被丢弃,新来的像素片段值会被保存到渲染目标上。因此回到球和盒子,假设球先渲染。在渲染目标上此时还没有几何体,因此整个球将会渲染上。但是当盒子的像素到达OM阶段时,OM阶段会对比新来的盒子的像素片段的深度值与之前就存在这儿的球的像素值。因为盒子是位于球的前面的,所以球的像素片段会被丢弃,且会将盒子的像素片段保存到渲染目标上。在所有的几何体绘制完毕后,最终还保留在渲染目标上的像素就是将要被显示在屏幕上的像素。

关于深度视图的模板部分是为高级技术准备的,比如镜像,随后会提到。

全局声明

声明两个结构对象。一个用于存储深度模板视图,一个用于存储深度模板缓冲

ID3D11DepthStencilView* depthStencilView;
ID3D11Texture2D* depthStencilBuffer;

深度模板缓冲描述

现在进入到d3d初始化部分,在创建深度模板缓冲前,需要先定义它。可通过填充结构体D3D11_TEXTURE2D_DESC来定义它,就像之前填充后缓冲一样。在这儿唯一要提及的事情是绑定标志和格式。格式提供了两个变量空间:深度为24位,模板为8位。绑定标志表示该纹理会被绑定到OM阶段作为深度模板缓冲。

//Describe our Depth/Stencil Buffer
D3D11_TEXTURE2D_DESC depthStencilDesc;depthStencilDesc.Width     = Width;
depthStencilDesc.Height    = Height;
depthStencilDesc.MipLevels = 1;
depthStencilDesc.ArraySize = 1;
depthStencilDesc.Format    = DXGI_FORMAT_D24_UNORM_S8_UINT;
depthStencilDesc.SampleDesc.Count   = 1;
depthStencilDesc.SampleDesc.Quality = 0;
depthStencilDesc.Usage          = D3D11_USAGE_DEFAULT;
depthStencilDesc.BindFlags      = D3D11_BIND_DEPTH_STENCIL;
depthStencilDesc.CPUAccessFlags = 0;
depthStencilDesc.MiscFlags      = 0;

创建深度模板视图

使用设备接口的CreateTexture2D方法创建深度模板缓冲。随后再创建深度模板视图并绑定到管线的OM阶段,通过调用设备接口的CreateDepthStencilView()方法实现。第一个参数是深度模板缓冲描述符,第二个参数是深度模板状态,设为NULL。第三个参数为深度模板缓冲。

d3d11Device->CreateTexture2D(&depthStencilDesc, NULL, &depthStencilBuffer);
d3d11Device->CreateDepthStencilView(depthStencilBuffer, NULL, &depthStencilView);

绑定深度模板视图

最后就是绑定深度模板视图到管线的OM阶段了。在之前的例子中该函数OMSetRenderTargets因为没有创建深度模板视图,因此设为NULL。在此就可将深度模板视图添加上去了。

d3d11DevCon->OMSetRenderTargets( 1, &renderTargetView, depthStencilView );

添加深度值到视口

现在到创建以及描述视口的地方了,应该告诉OM去将像素Z值或深度值转换为0~1之间的值。其中0表示最近,1表示最远。

viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;

销毁

别忘记释放COM对象

depthStencilView->Release();
depthStencilBuffer->Release();

释放深度模板视图

最后要确保清掉了每一帧的深度模板视图,就像对渲染目标视图所做的一样。在这儿使用函数ClearDepthStencilView()方法来实现。第一个参数为想要清理的深度模板视图,第二个参数为枚举类型,是一个逻辑或的结果,指定了深度模板视图要清理的哪一部分,第三个参数是想要清理到的深度值。在此设为1.0f是因为1.0f是图像所具备的最大深度值。这确保所有的对象绘制在屏幕上。若在这儿设为0.0f,则不会绘制任何图像到屏幕上,因为所有的像素片段深度值都是位于0~1之间的。最后一个参数值是设置模板的所到达的地方。在这儿设为0,是因为还没有使用模板。

d3d11DevCon->ClearDepthStencilView(depthStencilView, D3D11_CLEAR_DEPTH|D3D11_CLEAR_STENCIL, 1.0f, 0);

参考网址

代码实例:

#include "stdafx.h"
#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "d3dx11.lib")
#pragma comment(lib, "d3dx10.lib")#include <windows.h>
#include "Resource.h"
#include <d3d11.h>
#include <d3dx11.h>
#include <d3dx10.h>
#include <xnamath.h>//全局描述符
IDXGISwapChain* SwapChain;
ID3D11Device* d3d11Device;
ID3D11DeviceContext* d3d11DevCon;
ID3D11RenderTargetView* renderTargetView;//索引缓冲
ID3D11Buffer* squareIndexBuffer;
ID3D11Buffer* squareVertBuffer;//深度值-20170927
ID3D11DepthStencilView* depthStencilView;
ID3D11Texture2D* depthStencilBuffer;//着色器
ID3D11Buffer* triangleVertBuffer;
ID3D11VertexShader* VS;
ID3D11PixelShader* PS;
ID3D10Blob* VS_Buffer;
ID3D10Blob* PS_Buffer;
ID3D11InputLayout* vertLayout;
#if 0
float red = 0.0f;
float green = 0.0f;
float blue = 0.0f;
int colormodr = 1;
int colormodg = 1;
int colormodb = 1;
#endif
/
LPCTSTR WndClassName = "firstwindow";
HWND hwnd = NULL;
HRESULT hr;const int Width = 800; //设置宽
const int Height = 800; // 设置高
//函数声明
bool InitializeDirect3d11App(HINSTANCE hInstance);
//void ReleaseObjects();
void CleanUp();
bool InitScene();
void UpdateScene();
void DrawScene();// 初始化窗口
bool InitializeWindow(HINSTANCE hInstance,int ShowWnd,int width, int height,bool windowed);//初始化消息循环函数
int messageloop();
//初始化窗口回调过程。Windows API是事件驱动型的编程模型。在该函数中捕获Windows消息,比如一个按键按下(也叫事件)以及程序操作流程。LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);//顶点结构体以及顶点布局(输入布局)
struct Vertex
{Vertex(){}Vertex(float x, float y, float z,float cr, float cg, float cb, float ca):pos(x, y, z), color(cr, cg, cb, ca){}XMFLOAT3 pos;XMFLOAT4 color;
};D3D11_INPUT_ELEMENT_DESC layout[] = {{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
UINT numElements = ARRAYSIZE(layout);//主函数,传入应用程序句柄hInstance,前一个应用程序句柄hPrevInstance,传给函数处理的命令行lpCmdLine以及窗口显示方式的nShowCmd
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{//创建并注册窗口if (!InitializeWindow(hInstance, nShowCmd, Width, Height, true)){MessageBox(0, "Window Initilization - Failed", "Error", MB_OK);return 0;}/newif (!InitializeDirect3d11App(hInstance)) // 初始化D3D{MessageBox(0, "Direct3D Initialization - Failed", "Error", MB_OK);return 0;}if (!InitScene()){MessageBox(0, "Scene Initialization - Failed", "Error", MB_OK);return 0;}messageloop();CleanUp();//ReleaseObjects();return 0;
}
// windowed 若为true则为窗口模式显示,若为false则为全屏模式显示
bool InitializeWindow(HINSTANCE hInstance,int ShowWnd,int width, int height,bool windowed)
{/*typedef struct _WNDCLASS{UINT cbSize;UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HANDLE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCTSTR lpszMenuName;LPCTSTR lpszClassName;}WNDCLASS;*/WNDCLASSEX wc;wc.cbSize = sizeof(WNDCLASSEX); //window类的大小/********windows类风格*CS_CLASSDC 一个使用该类创建的在所有窗口间共享的设备上下文*CS_DBLCLKS 在窗口上使能双击功能*CS_HREDRAW 若窗口的宽度有改变或者窗口水平地移动,窗口将会刷新*CS_NOCLOSE 窗口菜单上禁止关闭选项*CS_OWNDC   为每个窗口创建自己的设备上下文。正好与CS_CLASSDC相反*CS_PARENTDC 这会设置创建的子窗口的剪裁四边形到父窗口,这允许子窗口能够在父窗口上绘画*CS_VERDRAW 若在窗口的高度或窗口在垂直方向有移动窗口会重绘**/wc.style = CS_HREDRAW | CS_VREDRAW;//lpfnWndProc是一个指向处理窗口消息函数的指针,设置窗口处理函数的函数名WndProcwc.lpfnWndProc = WndProc;//cbClsExtra是WNDCLASSEX之后额外申请的字节数wc.cbClsExtra = NULL;//cbWndExtra指定窗口实例之后所申请的字节数wc.cbWndExtra = NULL;//当前窗口应用程序的句柄,通过给函数GetModuleHandle()函数第一个参数传入NULL可获取当前窗口应用程序。wc.hInstance = hInstance;//hIcon用来指定窗口标题栏左上角的图标。以下是一些标准图标:/**IDI_APPLICATION 默认应用程序图标*IDI_HAND 手形状的图标*IDI_EXCLAMATION 感叹号图标*IDI_INFORMATION 星号图标*IDI_QUESTION 问号图标*IDI_WINLOGO 若使用的是XP则是默认应用程序图标,否则是窗口logo*/wc.hIcon = LoadIcon(NULL, (LPCTSTR)IDI_SMALL);/*定义光标图标*IDC_APPSTARTING 标准箭头以及小型沙漏光标*IDC_ARROW 标准箭头光标*IDC_CROSS 十字线光标*IDC_HAND 手型光标*IDC_NO 斜线圈光标*IDC_WAIT 沙漏光标*/wc.hCursor = LoadCursor(NULL, IDC_ARROW);//hbrBackground是一个刷子的句柄,可使得背景黑色。wc.hbrBackground = (HBRUSH)(COLOR_BTNSHADOW + 2);//附加到窗口的菜单名字,不需要的话设置为NULLwc.lpszMenuName = NULL;//对类进行命名wc.lpszClassName = WndClassName;//指定任务栏的图标,使用上面的IDI_图标wc.hIconSm = LoadIcon(NULL, (LPCTSTR)IDI_MYICON);//注册类。若失败则会获得一个错误,若成功,则继续创建窗口if (!RegisterClassEx(&wc)){MessageBox(NULL, "Error registering class", "Error", MB_OK | MB_ICONERROR);return 1;}//创建窗口hwnd = CreateWindowEx(NULL, WndClassName, "Drawing Square", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, width,height, NULL, NULL, hInstance, NULL);if (!hwnd){MessageBox(NULL, "Error registering class", "Error", MB_OK | MB_ICONERROR);return 1;}//BOOL ShowWindow(HWND hWnd, int nCmdShow);//BOOL UpdateWindow(HWND hWnd);ShowWindow(hwnd, ShowWnd);UpdateWindow(hwnd);// 发送WM_PAINT消息到窗口过程,若窗口客户区没有任何东西要显示,则不发送消息。返回true,继续运行到mainloop中去。return true;
}bool InitializeDirect3d11App(HINSTANCE hInstance)
{//声明缓冲DXGI_MODE_DESC bufferDesc;ZeroMemory(&bufferDesc, sizeof(DXGI_MODE_DESC));bufferDesc.Width = Width;bufferDesc.Height = Height;bufferDesc.RefreshRate.Numerator = 60;bufferDesc.RefreshRate.Denominator = 1;bufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;bufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;bufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;//声明交换链DXGI_SWAP_CHAIN_DESC swapChainDesc;ZeroMemory(&swapChainDesc, sizeof(DXGI_SWAP_CHAIN_DESC));swapChainDesc.BufferDesc = bufferDesc;swapChainDesc.SampleDesc.Count = 1;swapChainDesc.SampleDesc.Quality = 0;swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;swapChainDesc.BufferCount = 1;swapChainDesc.OutputWindow = hwnd;swapChainDesc.Windowed = TRUE;swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;//创建交换链D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, NULL, NULL, NULL,D3D11_SDK_VERSION, &swapChainDesc, &SwapChain, &d3d11Device, NULL, &d3d11DevCon);//创建后缓冲ID3D11Texture2D* BackBuffer;SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&BackBuffer);//创建渲染目标d3d11Device->CreateRenderTargetView(BackBuffer, NULL, &renderTargetView);BackBuffer->Release();//创建深度模板缓冲D3D11_TEXTURE2D_DESC depthStencilDesc;depthStencilDesc.Width = Width;depthStencilDesc.Height = Height;depthStencilDesc.MipLevels = 1;depthStencilDesc.ArraySize = 1;depthStencilDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;depthStencilDesc.SampleDesc.Count = 1;depthStencilDesc.SampleDesc.Quality = 0;depthStencilDesc.Usage = D3D11_USAGE_DEFAULT;depthStencilDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; //绑定到OMdepthStencilDesc.CPUAccessFlags = 0;depthStencilDesc.MiscFlags = 0;//创建深度模板视图d3d11Device->CreateTexture2D(&depthStencilDesc, NULL, &depthStencilBuffer);d3d11Device->CreateDepthStencilView(depthStencilBuffer, NULL, &depthStencilView);//设置渲染目标d3d11DevCon->OMSetRenderTargets(1, &renderTargetView, depthStencilView);return true;
}void CleanUp()
{SwapChain->Release();d3d11Device->Release();d3d11DevCon->Release();renderTargetView->Release();squareVertBuffer->Release();squareIndexBuffer->Release();//triangleVertBuffer->Release();VS->Release();PS->Release();VS_Buffer->Release();PS_Buffer->Release();vertLayout->Release();depthStencilView->Release();depthStencilBuffer->Release();
}void ReleaseObjects()
{
//释放创建的COM对象SwapChain->Release();d3d11Device->Release();d3d11DevCon->Release();
}bool InitScene()
{//编译着色器hr = D3DX11CompileFromFile("Effects.fx", 0, 0, "VS", "vs_4_0", 0, 0, 0, &VS_Buffer, 0, 0);hr = D3DX11CompileFromFile("Effects.fx", 0, 0, "PS", "ps_4_0", 0, 0, 0, &PS_Buffer, 0, 0);//创建着色器对象hr = d3d11Device->CreateVertexShader(VS_Buffer->GetBufferPointer(), VS_Buffer->GetBufferSize(), NULL, &VS);hr = d3d11Device->CreatePixelShader(PS_Buffer->GetBufferPointer(), PS_Buffer->GetBufferSize(), NULL, &PS);//设置顶点和像素着色器d3d11DevCon->VSSetShader(VS, 0, 0);d3d11DevCon->PSSetShader(PS, 0, 0);//创建顶点缓冲Vertex v[] = {Vertex(-0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f),Vertex(-0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f),Vertex(0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f),Vertex(0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f),};DWORD indices[] = {0,1,2,0,2,3,};D3D11_BUFFER_DESC indexBufferDesc;ZeroMemory(&indexBufferDesc, sizeof(indexBufferDesc));indexBufferDesc.Usage = D3D11_USAGE_DEFAULT;indexBufferDesc.ByteWidth = sizeof(DWORD) * 2 * 3;indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;indexBufferDesc.CPUAccessFlags = 0;indexBufferDesc.MiscFlags = 0;D3D11_SUBRESOURCE_DATA iinitData;iinitData.pSysMem = indices;d3d11Device->CreateBuffer(&indexBufferDesc, &iinitData, &squareIndexBuffer);d3d11DevCon->IASetIndexBuffer(squareIndexBuffer, DXGI_FORMAT_R32_UINT, 0);D3D11_BUFFER_DESC vertexBufferDesc;ZeroMemory(&vertexBufferDesc, sizeof(vertexBufferDesc));vertexBufferDesc.Usage = D3D11_USAGE_DEFAULT;vertexBufferDesc.ByteWidth = sizeof(Vertex) * 4;vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;vertexBufferDesc.CPUAccessFlags = 0;vertexBufferDesc.MiscFlags = 0;D3D11_SUBRESOURCE_DATA vertexBufferData;ZeroMemory(&vertexBufferData, sizeof(vertexBufferData));vertexBufferData.pSysMem = v;hr = d3d11Device->CreateBuffer(&vertexBufferDesc, &vertexBufferData, &squareVertBuffer);//设置顶点缓冲UINT stride = sizeof(Vertex);UINT offset = 0;d3d11DevCon->IASetVertexBuffers(0, 1, &squareVertBuffer, &stride, &offset);//创建输入布局d3d11Device->CreateInputLayout(layout, numElements, VS_Buffer->GetBufferPointer(),VS_Buffer->GetBufferSize(), &vertLayout);//设置输入布局d3d11DevCon->IASetInputLayout(vertLayout);//设置图元拓扑d3d11DevCon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);//创建视口D3D11_VIEWPORT viewport;ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));viewport.TopLeftX = 0;viewport.TopLeftY = 0;viewport.Width = Width;viewport.Height = Height;viewport.MinDepth = 0;viewport.MaxDepth = 1;//设置视口d3d11DevCon->RSSetViewports(1, &viewport);return true;
}void UpdateScene()
{// 更新场景颜色
#if 0red += colormodr * 0.00005f;green += colormodg * 0.00002f;blue += colormodb * 0.00001f;if (red >= 1.0f || red <= 0.0f)colormodr *= -1;if (green >= 1.0f || green <= 0.0f)colormodg *= -1;if (blue >= 1.0f || blue <= 0.0f)colormodb *= -1;
#endif
}void DrawScene()
{//将更新的颜色填充后缓冲
//  D3DXCOLOR bgColor(red, green, blue, 1.0f);float bgColor[4] = {(0.0f, 0.0f, 0.0f, 0.0f)};d3d11DevCon->ClearRenderTargetView(renderTargetView, bgColor);//刷新深度模板视图d3d11DevCon->ClearDepthStencilView(depthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);//绘制三角形d3d11DevCon->DrawIndexed(6, 0, 0);//画三角形//d3d11DevCon->Draw(3, 0);//将后缓冲呈现到屏幕SwapChain->Present(0, 0);
}int messageloop(){MSG msg;ZeroMemory(&msg, sizeof(MSG));//清除结构体被设为NULL。while (true){//使用PeekMessage()检查是否有消息传进来/*LPMSG lpMsg 消息结构体的指针*HWND hWnd 发送消息的窗口句柄。若设为NULL,那么它会从当前程序中接收来自任何一个窗口的消息*UINT wMsgFilterMin 指定消息范围内第一个要检查的消息的值。若wMsgFilterMin和wMsgFilterMax都设为0,那么PeekMessage将会检查素有的消息*UINT wMsgFilterMax 指定消息范围内最后一个要检测的消息的值*UINT wRemoveMsg 指定消息的处理方式。若设置为PM_REMOVE,则在读取之后会被删除*/if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){if (msg.message == WM_QUIT){break;}//若消息为窗口消息,则解析并分发它。TranslateMessage()将会让窗口做一些解析,类似键盘的虚拟键值转换到字符形式。//而DispatchMessage()则发送消息到窗口过程WndProc。TranslateMessage(&msg);DispatchMessage(&msg);}else //若没有窗口消息,则运行游戏{// run game codeUpdateScene();DrawScene();}}return msg.wParam;
}//窗口消息处理函数
//HWND hwnd 获取消息的窗口句柄
//UINT msg 消息的内容
/*
*WM_ACTIVE 当窗口激活时发送的消息
*WM_CLOSE 当窗口关闭时发送的消息
*WM_CREATE 当窗口创建时发送的消息
*WM_DESTROY 当窗口销毁时发送的消息
*/
//wParam和lParam时消息的额外信息。使用wParam来检测键盘输入消息
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{// 这是事件检测消息的地方,若escape键被按下,会显示一个消息框,询问是否真的退出。若点击yes,则程序关闭。若不点击,则消息框关闭。若消息包含WM_DESTROY// 则意味着窗口正在被销毁,返回0并且程序关闭switch (msg){case WM_KEYDOWN:if (wParam == VK_ESCAPE){if (MessageBox(0, "Are you sure you want to exit?","Really?", MB_YESNO | MB_ICONASTERISK) == IDYES){DestroyWindow(hwnd);}return 0;}break;case WM_DESTROY:PostQuitMessage(0);break;default:break;}//调用默认窗口过程函数return DefWindowProc(hwnd,msg,wParam,lParam);
}

效果图看上去与上一篇类似,本质上是不同的:

D3D11的深度模板缓冲相关推荐

  1. Opengl-帧缓冲(一个新的缓冲对象,想一下深度和模板缓冲)

    OpenGL中的缓冲只是一个管理特定内存块的对象,没有其它更多的功能了. 首先我们明确一个原理或者道理,不论是什么缓冲,深度也好,模板也罢.再往前说的顶点数据的颜色缓冲.都是一个存储的单元,都是一个存 ...

  2. 什么是模板缓冲(Stencil Buffer)

    什么是模板缓冲(Stencil Buffer) 模板缓冲类似于深度缓冲.事实上,它使用深度缓冲的一部分(因此,深度缓冲常常被称做depth-stencil缓冲).深度缓冲让程序员可以设置一个模板函数测 ...

  3. 模板缓冲_模板缓冲以及如何使用它可视化体积相交

    模板缓冲 介绍 (Introduction) The trendy thing in real-time rendering these days is ray-tracing. However, t ...

  4. DirectX11 With Windows SDK--12 深度/模板状态、平面镜反射绘制

    前言 深度/模板测试使用的是与后备缓冲区同等分辨率大小的缓冲区,每个元素的一部分连续位用于深度测试,其余的则用作模板测试.两个测试的目的都是为了能够根据深度/模板状态需求的设置来选择需要绘制的像素. ...

  5. 【D3D11游戏编程】学习笔记十八:模板缓冲区的使用、镜子的实现

    (注:[D3D11游戏编程]学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 模板缓冲区(Stencil Buffe ...

  6. D3D11的简单字体

    本篇的任务是要先学会混合和纹理才能够做到的. 这儿有几种方法能够在D3D11中实现字体显示,一个是学会使用微软想要我们使用的两个新的API,Direct2D和DirectWrite,实际上它们是很有用 ...

  7. D3D11 骨骼动画(基于MD5格式)

    MD5格式利用了骨骼系统(也称为关节系统)来做动画效果,因此在本章节会介绍如何遍历存储在md5anim文件中的动画以及如何将动画应用在模型上.骨骼系统(也称为关节系统)优点在于比直接存储关键帧动画要占 ...

  8. D3D11 渲染状态

    这儿是在上一个博客基础上修改转换代码.在D3D中,物体都是停留在当前状态中的,没有物体会回退到它的"默认"状态.比如图元拓扑,一旦设置了它,就像之前在一个三角形列表中所做的一样,除 ...

  9. D3D11 简单光照

    有四种类型光照以及三种光源.本章将介绍使用一个"定向"光源如何实现简单光照.在随后的章节会介绍其他两种类型的光源和镜面光照. 光照对于视频游戏的真实外观和感觉是非常重要的. 由于固 ...

最新文章

  1. stm32单片机入门视频教程看哪个?一般用什么软件编程比较好?
  2. R语言ggplot2可视化:ggplot2可视化散点图并使用geom_mark_ellipse函数在数据簇或数据分组的数据点周围添加椭圆(ellipse)进行注释(对椭圆包围的区域进行着色为阴影区域)
  3. linux的备份和恢复命令,Linux基本命令——备份与恢复文档
  4. 零基础学习爬虫并实战
  5. matlab weibpdf函数,matlab建模常用函数
  6. 一企业彻底实现金融风险数字化,节约人力超4000小时
  7. Apache Beam的API设计
  8. Android开发笔记(一百六十一)NFC近场通信
  9. 我的课程表--项目需求分析
  10. 乳腺癌检测_逻辑回归
  11. 不想开滴滴、送外卖的产品经理,听我一声劝……
  12. PLC-Recorder通过Modbus TCP/Modbus RTU转换器实现RS-485总线设备采集的方法
  13. What is a hardlink and how to create one?
  14. 小米手机获取root权限完整详细教程,亲测可用(精)
  15. iOS/iPhone 微信打开doc xls文件报错OfficeImportErrorDomain错误912 打不开文档
  16. PTA(接口)用java写 7-10 房屋、住宅、写字楼类
  17. 欧文分校计算机科学硕士项目,申请2019加州大学欧文分校计算机科学硕士要求都有哪些?...
  18. 微信小程序 -数字滚动动画
  19. Dubbo分布式事务处理--视频教程
  20. 计算机技术在生物教学中应用,信息技术在生物教学中的应用

热门文章

  1. 爬虫 JavaScript 逆向进阶!利用 AST 技术还原混淆代码
  2. 上手体验华为AI平台ModelArts
  3. 一、ShardingSphere简介(来自官方文档)
  4. 发布DCWriter电子病历文本编辑器
  5. 计算机水平用什么形容词形容,形容应用价值的词语有哪些 , 形容价值的成语有哪些...
  6. 盲打打字php,讯飞输入法盲打键盘闪亮登场 是时候展示你真正的技术了
  7. 7、PN结的电容效应
  8. oracle ora 39111,数据迁移 有几个用户 imp导入时候 报错 ORA-39111,ORA-39112 - Oracle论坛 - 51CTO技术论坛_中国领先的IT技术社区...
  9. 服务器除了一个灯亮其余的都不亮,鼠标键盘没反应
  10. paip VOB DVD视频的无损分割与截取