阅读了 龙书网页版前六章,通过渲染一个三角形,总结渲染的最简步骤。

DirectX 渲染的主要步骤

  • 创建窗口
  • DirectX 初始化
    • 创建设备和设备上下文
    • 创建Factroy
    • 填充交换链描述符
    • 创建交换链
    • 创建渲染目标视图,设置视口大小
  • 创建着色器
  • 填充缓冲区并绑定到渲染管线
    • 定义顶点数据结构体
    • 创建顶点缓冲区、填充并绑定
    • 创建索引缓冲区、填充并绑定
    • 创建顶点常量缓冲区、填充并绑定
    • 创建像素常量缓冲区、填充并绑定
    • 设置图元类型
    • 创建并绑定输入布局(也可以在创建完顶点着色器后立马创建)
    • 将着色器和相应阶段的常量缓冲区绑定到渲染管线。
  • 渲染
  • 主函数调用所有流程
    • 着色器代码
  1. 创建窗口。
  2. 创建设备和上下文。
  3. 创建交换链和渲染视图。
  4. 创建顶点着色器。
  5. 创建并绑定输入布局。
  6. 创建片段着色器。
  7. 创建顶点、索引、常量缓冲区,并填充和绑定。
  8. 设置图元拓扑(图元类型)。
  9. 将着色器和常量缓冲区绑定到渲染管线。
  10. 清空渲染视图。
  11. 绘制
  12. 呈现
  13. 转到步骤10.

以下是每个步骤的代码
准备工作
需要包含的头文件

#include <windows.h>
#include <wrl/client.h> // Comptr智能指针
#include <d3d11_1.h>
#include <d3d11_2.h>
#include <string>
#include <DirectXMath.h>
#include <d3dcompiler.h>// 添加DirectX11所有要引用的库
#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "dxgi.lib")
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "D3DCompiler.lib")
#pragma comment(lib, "winmm.lib")

整个流程所需要的变量和结构体

template <class T>
using ComPtr = Microsoft::WRL::ComPtr<T>; // 微软的智能指针using namespace DirectX;
// 需要的所有变量
int winX = 0;
int winY = 0;
int winWidth = 1920;
int winHeight = 1080;struct VertexPosColor
{DirectX::XMFLOAT3 pos;DirectX::XMFLOAT4 color;static const D3D11_INPUT_ELEMENT_DESC inputLayout[2];
};const D3D11_INPUT_ELEMENT_DESC VertexPosColor::inputLayout[2] = {//-|-语义名字-|--|语义索引-|----|---------数据格式-----------|--|-输入槽索引[0-15]-|---|-字节对齐偏移量-|---|----输入槽类(顶点or索引)-----|---|-多实例渲染个数-|- {  "POSITION",       0,           DXGI_FORMAT_R32G32B32_FLOAT,          0,                   0,                D3D11_INPUT_PER_VERTEX_DATA,          0     },{  "COLOR",          0,           DXGI_FORMAT_R32G32B32_FLOAT,          0,                   12,               D3D11_INPUT_PER_VERTEX_DATstruct VSConstantBuffer  //顶点常量缓冲区
{XMMATRIX world;XMMATRIX view;XMMATRIX proj;
};struct PSConstantBuffer
{XMFLOAT4 color;XMMATRIX proj;
};HWND ghMainWnd = 0;   // 窗口句柄ComPtr<ID3D11Device> pd3dDevice = nullptr;                    // D3D11设备
ComPtr<ID3D11DeviceContext> pd3dDeviceContext = nullptr;      // D3D11设备上下文DXGI_SWAP_CHAIN_DESC sd;
ComPtr<IDXGISwapChain> pSwapChain = nullptr;                  // D3D11交换链
ComPtr<IDXGIFactory1> dxgiFactory = nullptr;//常用资源
ComPtr<ID3D11Texture2D> m_pDepthStencilBuffer = nullptr;        // 深度模板缓冲区
ComPtr<ID3D11RenderTargetView> m_pRenderTargetView = nullptr;   // 渲染目标视图
ComPtr<ID3D11DepthStencilView> m_pDepthStencilView = nullptr;   // 深度模板视图
D3D11_VIEWPORT m_ScreenViewport;                                // 视口//着色器资源ComPtr<ID3DBlob> vertexBlob;  // 顶点着色器
ComPtr<ID3DBlob> pixBlob;     //像素着色器ComPtr<ID3D11InputLayout> pVertexLayout = nullptr;     // 顶点输入布局
ComPtr<ID3D11Buffer> pVertexBuffer = nullptr;          // 顶点缓冲区
ComPtr<ID3D11VertexShader> pVertexShader = nullptr;    // 顶点着色器
ComPtr<ID3D11PixelShader> pPixelShader = nullptr;      // 像素着色器
ComPtr<ID3D11Buffer> pIndexBuffer = nullptr;           // 索引缓冲区ComPtr<ID3D11Buffer> pVSConstBuffer = nullptr;         // 顶点常量缓冲区
ComPtr<ID3D11Buffer> pPSConstBuffer = nullptr;         // 顶点常量缓冲区
VSConstantBuffer VSCBuffer;                           // 用于修改顶点GPU常量缓冲区的变量
PSConstantBuffer PSCBuffer;                           // 用于修改顶点GPU常量缓冲区的变量

创建窗口

/*************************************************创建窗口*************************************************/
/* 注意
* 1. 必须设置窗口事件处理回调函数 LRESULT  CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
* 2. 窗口的信息可以在 WNDCLASS 中设置,比如窗口的图标,标题等。
* 3. 调用CreateWindow创建窗口。
* 4. 创建完窗口,可以得到一个窗口句柄(HWND ghMainWnd),后面创建交换链会用到这个窗口句柄。
*/
// 窗口事件处理回调函数
LRESULT  CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {switch (msg){case WM_LBUTTONDOWN:MessageBox(0, L"Hello,world!", L"Hello", MB_OK);return 0;case WM_KEYDOWN:if (wParam == VK_ESCAPE)DestroyWindow(ghMainWnd);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hWnd, msg, wParam, lParam);
}//创建窗口函数
bool InitWindowsApp(HINSTANCE instanceHandle, int show)
{WNDCLASS wc;wc.style = CS_HREDRAW | CS_VREDRAW;  // 水平或者垂直方向发生变化时,重新绘制 redrawwc.lpfnWndProc = WndProc;wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hInstance = instanceHandle;wc.hIcon = LoadIcon(0, IDI_APPLICATION);wc.hCursor = LoadCursor(0,IDC_ARROW);wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wc.lpszMenuName = 0;wc.lpszClassName = L"BasicWndClass";if (!RegisterClass(&wc)){MessageBox(0, L"RegisterClass FAILED", 0, 0);return false;}ghMainWnd = CreateWindow(L"BasicWndClass",L"Win32Basic",WS_OVERLAPPEDWINDOW,winX,winY,winWidth,winHeight,0,0,instanceHandle,0);if (ghMainWnd == 0){MessageBox(0, L"CreateWindow FAILED", 0, 0);return false;}ShowWindow(ghMainWnd,show);UpdateWindow(ghMainWnd);return true;
}

DirectX 初始化

  • 创建设备和设备上下文
  • 创建Factory
  • 填充交换链描述符
  • 创建交换链
  • 创建渲染目标视图(窗口大小发生变化时)
  • 设置视口变换

创建设备和设备上下文

// 创建设备和设备上下文
bool createDirectDevice(){UINT createDeviceFlags = 0;
#if defined(DEBUG) || defined(_DEBUG)createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif// 驱动类型数组D3D_DRIVER_TYPE driverTypes[] ={D3D_DRIVER_TYPE_HARDWARE,   //硬件驱动//D3D_DRIVER_TYPE_WARP,       //WARP驱动D3D_DRIVER_TYPE_REFERENCE,  //软件驱动};UINT numDriverTypes = ARRAYSIZE(driverTypes);// 特性等级数组D3D_FEATURE_LEVEL featureLevels[] ={D3D_FEATURE_LEVEL_11_1,D3D_FEATURE_LEVEL_11_0,};UINT numFeatureLevels = ARRAYSIZE(featureLevels);D3D_FEATURE_LEVEL featureLevel;D3D_DRIVER_TYPE d3dDriverType;HRESULT hr;for (UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++){d3dDriverType = driverTypes[driverTypeIndex];hr = D3D11CreateDevice(nullptr, d3dDriverType, nullptr, createDeviceFlags, featureLevels, numFeatureLevels,D3D11_SDK_VERSION, pd3dDevice.GetAddressOf(), &featureLevel, pd3dDeviceContext.GetAddressOf());// 如果你的系统不支持Direct3D 11.1的API,D3D11CreateDevice会立即停止特性数组的轮询并返回E_INVALIDARGif (hr == E_INVALIDARG){// Direct3D 11.0 的API不承认D3D_FEATURE_LEVEL_11_1,所以我们需要尝试特性等级11.0以及以下的版本hr = D3D11CreateDevice(nullptr, d3dDriverType, nullptr, createDeviceFlags, &featureLevels[1], numFeatureLevels - 1,D3D11_SDK_VERSION, pd3dDevice.GetAddressOf(), &featureLevel, pd3dDeviceContext.GetAddressOf());}if (SUCCEEDED(hr))break;if (FAILED(hr)){MessageBox(0, L"D3D11CreateDevice Failed.", 0, 0);return false;}// 检测是否支持特性等级11.0或11.1if (featureLevel != D3D_FEATURE_LEVEL_11_0 && featureLevel != D3D_FEATURE_LEVEL_11_1){MessageBox(0, L"Direct3D Feature Level 11 unsupported.", 0, 0);return false;}return hr == S_OK;

创建Factroy

// 创建Factroy
bool createFactroy()
{//HRESULT hr;ComPtr<IDXGIDevice> dxgiDevice = nullptr;ComPtr<IDXGIAdapter> dxgiAdapter = nullptr;hr =  pd3dDevice.As(&dxgiDevice);dxgiDevice->GetAdapter(dxgiAdapter.GetAddressOf());dxgiAdapter->GetParent(__uuidof(IDXGIFactory1),reinterpret_cast<void**>(dxgiFactory.GetAddressOf()));return hr == S_OK;
}

填充交换链描述符

// 填充交换链描述符
bool initSwapChainDesc()
{HRESULT hr;ZeroMemory(&sd, sizeof(sd));sd.BufferCount = 1;sd.BufferDesc.Width = winWidth;sd.BufferDesc.Height = winHeight;sd.BufferDesc.RefreshRate.Numerator = 60;sd.BufferDesc.RefreshRate.Denominator = 1;sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;sd.SampleDe

创建交换链

// 创建交换链
bool createSwapChain()
{HRESULT hr;hr = dxgiFactory->CreateSwapChain(pd3dDevice.Get(),&sd,pSwapChain.GetAddressOf());return hr == S_OK;
}

创建渲染目标视图,设置视口大小

// 创建渲染目标视图,设置视口大小(窗口大小发生变化时重新创建)
void resizeWin()
{assert(pd3dDevice);assert(pd3dDeviceContext);assert(pSwapChain);m_pRenderTargetView.Reset();HRESULT hr;ComPtr<ID3D11Texture2D> backBuffer;hr = pSwapChain->ResizeBuffers(1,winWidth,winHeight,DXGI_FORMAT_R8G8B8A8_UNORM,0);hr = pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(backBuffer.GetAddressOf()));hr = pd3dDevice->CreateRenderTargetView(backBuffer.Get(),nullptr,m_pRenderTargetView.GetAddressOf());backBuffer.Reset();pd3dDeviceContext->OMSetRenderTargets(1,m_pRenderTargetView.GetAddressOf(),nullptr);m_ScreenViewport.TopLeftX = 0.0f;m_ScreenViewport.TopLeftY = 0.0f;m_ScreenViewport.Width = static_cast<float>(winWidth);m_ScreenViewport.Height = static_cast<float>(winHeight);m_ScreenViewport.MinDepth = 0.0f;m_ScreenViewport.MaxDepth = 1.0f;pd3dDeviceContext->RSSetViewports(1,&m_ScreenViewport);

创建着色器

  • 编译顶点着色器到Blob,同时写入到cso文件,着色器若未修改,下次直接读取,不用编译。
  • 使用设备创建顶点着色器。
  • 编译像素着色器到Blob,同时写入到cso文件,着色器若未修改,下次直接读取,不用编译。
  • 使用设备创建像素着色器。
/*************************************************创建着色器*************************************************/
bool createShader()
{HRESULT hr;DWORD dwShaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;
#ifdef _DEBUG// 设置 D3DCOMPILE_DEBUG 标志用于获取着色器调试信息。该标志可以提升调试体验,// 但仍然允许着色器进行优化操作dwShaderFlags |= D3DCOMPILE_DEBUG;// 在Debug环境下禁用优化以避免出现一些不合理的情况dwShaderFlags |= D3DCOMPILE_SKIP_OPTIMIZATION;
#endif//创建顶点着色器{hr = D3DCompileFromFile(L"C:\\Users\\MultiMediaServer\\Desktop\\learn\\\D3D11Learn\\HLSL\\D3D11Learn_VS.hlsl",nullptr, D3D_COMPILE_STANDARD_FILE_INCLUDE, "VS", "vs_5_0",dwShaderFlags, 0, vertexBlob.ReleaseAndGetAddressOf(), nullptr);// 若指定了输出文件名,则将着色器二进制信息输出hr = D3DWriteBlobToFile(vertexBlob.Get(), L"HLSL\\D3D11Learn_VS.cso", FALSE);hr = pd3dDevice->CreateVertexShader(vertexBlob->GetBufferPointer(), vertexBlob->GetBufferSize(), nullptr, pVertexShader.GetAddressOf());}{hr = D3DCompileFromFile(L"C:\\Users\\MultiMediaServer\\Desktop\\learn\\\D3D11Learn\\HLSL\\D3D11Learn_PS.hlsl",nullptr, D3D_COMPILE_STANDARD_FILE_INCLUDE, "PS", "ps_5_0",dwShaderFlags, 0, pixBlob.ReleaseAndGetAddressOf(), nullptr);// 若指定了输出文件名,则将着色器二进制信息输出hr = D3DWriteBlobToFile(pixBlob.Get(), L"HLSL\\D3D11Learn_PS.cso", FALSE);hr = pd3dDevice->CreatePixelShader(pixBlob->GetBufferPointer(),pixBlob->GetBufferSize(),nullptr,pPixelShader.GetAddressOf());}return hr == S_OK;
}

填充缓冲区并绑定到渲染管线

定义顶点数据结构体

创建顶点缓冲区、填充并绑定

创建索引缓冲区、填充并绑定

创建顶点常量缓冲区、填充并绑定

创建像素常量缓冲区、填充并绑定

设置图元类型

创建并绑定输入布局(也可以在创建完顶点着色器后立马创建)

将着色器和相应阶段的常量缓冲区绑定到渲染管线。

bool initResource()
{HRESULT hr;// 设置三角形顶点和颜色VertexPosColor vertices[] ={{ XMFLOAT3(0.0f, 0.5f, 0.5f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) },{ XMFLOAT3(0.5f, -0.5f, 0.5f), XMFLOAT4(0.0f, 0.0f, 1.0f, 1.0f) },{ XMFLOAT3(-0.5f, -0.5f, 0.5f), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) }};//设置顶点缓冲区描述D3D11_BUFFER_DESC vbd;ZeroMemory(&vbd,sizeof(vbd));vbd.Usage = D3D11_USAGE_IMMUTABLE;vbd.ByteWidth = sizeof(vertices);vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;vbd.CPUAccessFlags = 0;// 创建顶点缓冲区D3D11_SUBRESOURCE_DATA initData;ZeroMemory(&initData, sizeof(initData));initData.pSysMem = vertices;hr = pd3dDevice->CreateBuffer(&vbd,&initData, pVertexBuffer.GetAddressOf());//绑定顶点缓冲区UINT stride = sizeof(VertexPosColor);   // 跨越字节数UINT offset = 0;                        // 起始偏移量pd3dDeviceContext->IASetVertexBuffers(0, 1, pVertexBuffer.GetAddressOf(), &stride, &offset);DWORD indices[] = {0, 1, 2,0};//设置索引缓冲区描述D3D11_BUFFER_DESC ibd;ZeroMemory(&ibd, sizeof(ibd));ibd.Usage = D3D11_USAGE_IMMUTABLE;ibd.ByteWidth = sizeof(indices);ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;ibd.CPUAccessFlags = 0;initData.pSysMem = indices; // D3D11_SUBRESOURCE_DATA // 新建索引缓冲区hr = pd3dDevice->CreateBuffer(&ibd, &initData, pIndexBuffer.GetAddressOf());pd3dDeviceContext->IASetIndexBuffer(pIndexBuffer.Get(), DXGI_FORMAT_R32_UINT,0);/****************************常量缓冲区***********************************///设置顶点常量缓冲区描述D3D11_BUFFER_DESC cbd;ZeroMemory(&cbd, sizeof(cbd));cbd.Usage = D3D11_USAGE_DYNAMIC;cbd.ByteWidth = sizeof(VSConstantBuffer);cbd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;cbd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;//创建顶点常量缓冲区hr = pd3dDevice->CreateBuffer(&cbd,nullptr,pVSConstBuffer.GetAddressOf());VSCBuffer.world = XMMatrixTranspose(XMMatrixTranslation(0.4, 0.0, 0.0));VSCBuffer.view = XMMatrixIdentity();VSCBuffer.proj = XMMatrixIdentity();//填充顶点常量缓冲区VSCBuffer.world = XMMatrixTranspose(XMMatrixTranslation(0.4, 0.0, 0.0));VSCBuffer.view = XMMatrixIdentity();VSCBuffer.proj = XMMatrixIdentity();D3D11_MAPPED_SUBRESOURCE mappedData;hr = pd3dDeviceContext->Map(pVSConstBuffer.Get(),0, D3D11_MAP_WRITE_DISCARD,0,&mappedData);memcpy_s(mappedData.pData, sizeof(VSCBuffer), &VSCBuffer, sizeof(VSCBuffer));pd3dDeviceContext->Unmap(pVSConstBuffer.Get(), 0);//设置像素常量缓冲区描述D3D11_BUFFER_DESC cbd1;ZeroMemory(&cbd1, sizeof(cbd1));cbd1.Usage = D3D11_USAGE_DYNAMIC;cbd1.ByteWidth = sizeof(PSConstantBuffer);cbd1.BindFlags = D3D11_BIND_CONSTANT_BUFFER;cbd1.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;//创建像素常量缓冲区hr = pd3dDevice->CreateBuffer(&cbd,nullptr,pPSConstBuffer.GetAddressOf());//填充像素常量缓冲区PSCBuffer.color = XMFLOAT4(1.0, 0.0, 0.0, 1.0);PSCBuffer.proj = XMMatrixIdentity();D3D11_MAPPED_SUBRESOURCE mappedData1;hr = pd3dDeviceContext->Map(pPSConstBuffer.Get(),0, D3D11_MAP_WRITE_DISCARD,0,&mappedData1);memcpy_s(mappedData1.pData, sizeof(PSCBuffer), &PSCBuffer, sizeof(PSCBuffer));pd3dDeviceContext->Unmap(pPSConstBuffer.Get(), 0);//创建输入布局并绑定pd3dDevice->CreateInputLayout(VertexPosColor::inputLayout, ARRAYSIZE(VertexPosColor::inputLayout),  vertexBlob->GetBufferPointer(), vertexBlob->GetBufferSize(), pVertexLayout.GetAddressOf());pd3dDeviceContext->IASetInputLayout(pVertexLayout.Get());//设置图元类型pd3dDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);// 将着色器绑定到渲染管线pd3dDeviceContext->VSSetShader(pVertexShader.Get(), nullptr, 0);pd3dDeviceContext->VSSetConstantBuffers(0, 1, pVSConstBuffer.GetAddressOf());pd3dDeviceContext->PSSetShader(pPixelShader.Get(), nullptr, 0);pd3dDeviceContext->PSSetConstantBuffers(1, 1, pPSConstBuffer.GetAddressOf());return hr == S_OK;
}

渲染

int Run()
{MSG msg = { 0 };BOOL bRet = 1;assert(pd3dDeviceContext);assert(pSwapChain);while ((bRet = GetMessage(&msg,0,0,0)) != 0){static float black[4] = { 0.0f, 0.0f, 0.0f, 1.0f };pd3dDeviceContext->ClearRenderTargetView(m_pRenderTargetView.Get(), black);pd3dDeviceContext->DrawIndexed(3, 0, 0);pSwapChain->Present(1, 0);}return (int)msg.wParam;
}

主函数调用所有流程

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nCmdShow)
{if (!InitWindowsApp(hInstance, nCmdShow))return 0;bool b = createDirectDevice();b = createFactroy();b = initSwapChainDesc();b = createSwapChain();resizeWin();b = createShader();b = initResource();return Run();
}

着色器代码

头文件

cbuffer VSConstantBuffer : register(b0)
{matrix g_World;matrix g_View;matrix g_Proj;
}cbuffer PSConstantBuffer : register(b1)
{float4 g_color;matrix temp;
}
struct VertexIn
{float3 pos : POSITION;
};
struct VertexOut
{float4 pos : SV_POSITION;
};

像素着色器

#include "D3D11Learn.hlsli"float4 PS() : SV_Target
{return g_color;
}

// 顶点着色器

#include "D3D11Learn.hlsli"
VertexOut VS(VertexIn vIn)
{VertexOut vOut;vOut.pos = mul(float4(vIn.pos, 1.0f), g_World);vOut.pos = mul(vOut.pos, g_View);vOut.pos = mul(vOut.pos, g_Proj);//vOut.pos = float4(vIn.pos, 1.0f);return vOut;
}

DirectX 3D 简单渲染流程相关推荐

  1. Directx 3D - TL渲染流水线

    Directx 3D - T&L渲染流水线 1. 基本概念    Directx 3D渲染图形可以分为两个阶段.第一个阶段称为转换和照明(T&L),该阶段每个对象的顶点从一个抽象的.浮 ...

  2. 3d网上渲染平台是怎么渲图的_云渲染流程详解!

    题主说的看到许多网友对''3d网上渲染平台是怎么渲图的''进行提问,瑞云渲染小编也提供自己的小小见解.针对3D网上渲染平台是指什么,实际应该是指云渲染农场.几十年来,随着计算机软硬件不断更迭,图形图像 ...

  3. 第一回 开篇 D3D渲染流程简介

    第一回 开篇 D3D渲染流程简介 http://developer.178.com/201004/65293187592.html 开发这个3D engine已经两年半了,从06年8月刚开始统计的4万 ...

  4. html3d模型渲染,【SVG】纯clip-path打造的3D模型渲染器

    几天之前, 一个species-in-pieces的网站把我震到了(如下图), 出于一个优秀前端的敏锐嗅觉和原始本能, 我立刻祭出了看家法宝--Chrome开发者工具开始偷窥这个网站. 简单推敲之后, ...

  5. chrome渲染流程(自己看的,写的比较乱)

    1.渲染流程 由于渲染机制过于复杂,所以渲染模块在执行过程中会被划分为很多子阶段,输入HTML经过这些子阶段,最后输出像素,我们把这样一个处理流程叫做渲染流水线,流水线可分为如下几个子阶段: 构建do ...

  6. 国内外3D游戏开发流程和职位分类

    国内外3D游戏开发流程和职位分类 分类: 网游相关2010-07-04 21:11 851人阅读 评论(0) 收藏 举报 国内3D游戏开发流程 开发团队 n 制作人 n 执行制作人 n 策划团队 n ...

  7. ArcEngine C# GIS开发入门作业 (三)Ex04——实现地图的简单渲染和唯一值渲染

    文章评论 写评论 sinat_37432938: 可以说非常有参考的意义,谢谢分享 4周前 #2楼 举报回复查看回复(1) domen_dragon 回复 sinat_37432938: 哈哈,谢谢夸 ...

  8. 3D渲染技术分享:实时3D水面渲染(反射、折射、水深与水岸柔边)

    一.开篇 自从上次写了**<用实时反射Shader增强画面颜值>** 后,不少开发者开始尝试用它来渲染水面,但效果都差强人意. 这是因为,水面除了反射,还有许多细节需要考虑. 在此之前,也 ...

  9. 3D动画渲染软件 KeyShot 11 Pro for mac

    KeyShot 11 Pro for Mac是一款以先进的技术算法.全局光照领域的研究和Luxion内部研究为基础而开发,可以帮助用户轻松进行各种3D图像的渲染的3D动画渲染软件,keyshot11 ...

最新文章

  1. C#类在初始化时的执行顺序
  2. android 如何使用LaunchMode
  3. 运行shell脚本报错:“syntax error near unexpected token fi 的解决方法
  4. 企业实施ERP有哪些收益分析-要做到心中有数
  5. 性能,不是不重要,而是,它没有可维护性重要
  6. 动态加载Asp.net分页控件
  7. 常用Linux命令--CPU和GPU查看
  8. 8. 查询表orders——统计各类商品的销售量
  9. 数据挖掘常用算法优缺点分析
  10. 考研二战日记-第11天——高数2.1 导数概念
  11. Dynamics 365 配置IFD的向导界面下一步按钮禁用的解决办法
  12. 评《设计模式之禅》一书
  13. 微信发布Windows PC 测试版,支持电脑与手机互迁聊天记录
  14. MySQL为什么会抖一下
  15. 乱花渐欲迷人眼的C编译器中,谁才是“编译之王”?
  16. Nutz cnd.wrap传参
  17. 《釋迦牟尼佛傳》台词
  18. IDEA中同窗口导入新的maven项目
  19. mysql的查询、子查询、连接查询、groud by分组查询
  20. 提升物业服务品质,提高业主满意度:物业客户服务管理解决方案设计

热门文章

  1. Matrix4x4.TRS()
  2. git之合并分支|git如何合并分支
  3. 基于php二手书交易系统,二手书交易系统论文.doc
  4. c语言简单验证哥德巴赫猜想
  5. Centos7学习——echo命令
  6. java 二维表格_实现二维表
  7. unity中的渲染优化技术
  8. 移动内部疯传的11篇VoLTE学习笔记,看懂了你也是技术大神(一)
  9. 钉钉请假单如何下载到电脑打印
  10. 蚂蚁金服是如何实现App端侧的极致体验的?