OpenSubdiv.OPENSUBDIV_VERSION.Bfr
OpenSubdiv.OPENSUBDIV_VERSION.Far
OpenSubdiv.OPENSUBDIV_VERSION.Osd
OpenSubdiv.OPENSUBDIV_VERSION.Sdc
OpenSubdiv.OPENSUBDIV_VERSION.Vtr

OpenSubdiv.OPENSUBDIV_VERSION.Osd.D3D11StencilTable

OpenSubdiv是一个高性能、可扩展的细分曲面框架。在OpenSubdiv中,Osd.D3D11StencilTable是一个用于Direct3D11的StencilTable类。

StencilTable是一个数据结构,用于存储细分曲面中的拓扑信息。它包含了一个整数数组,表示每个顶点在不同细分层次上的相邻顶点的位置。D3D11StencilTable是一个基于Direct3D 11的特化实现,它能够很好地与Direct3D 11的API集成,使得细分曲面渲染更加高效。

使用方法

使用Osd.D3D11StencilTable,需要进行以下步骤:

  1. 创建一个ID3D11Buffer来存储StencilTable数据。
std::unique_ptr<ID3D11Buffer> tableBuffer;
D3D11_BUFFER_DESC desc;
desc.ByteWidth = table->GetGpuSize();
desc.Usage = D3D11_USAGE_IMMUTABLE;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = 0;
desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
desc.StructureByteStride = sizeof(unsigned int);

D3D11_SUBRESOURCE_DATA initData;
initData.pSysMem = table->GetBuffer();
initData.SysMemPitch = 0;
initData.SysMemSlicePitch = 0;

d3dDevice->CreateBuffer(&desc, &initData, tableBuffer.GetAddressOf());
  1. 创建一个ShaderResourceView来绑定StencilTable数据。
std::unique_ptr<ID3D11ShaderResourceView> tableSrv;
D3D11_SHADER_RESOURCE_VIEW_DESC desc;
desc.Format = DXGI_FORMAT_UNKNOWN;
desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
desc.Buffer.ElementOffset = 0;
desc.Buffer.ElementWidth = table->GetNumIndices();

d3dDevice->CreateShaderResourceView(tableBuffer.Get(), &desc, tableSrv.GetAddressOf());
  1. 在着色器中使用StencilTable。

在Pixel Shader中,需要使用该函数来获取StencilTable数据:

uint indices[4] = { 0 };
table.Sample(pointIndex, indices);

pointIndex是当前像素所在的顶点的全局索引。

参考链接

  • OpenSubdiv官方文档: https://graphics.pixar.com/opensubdiv/docs/intro.html
  • Direct3D 11官方文档: https://docs.microsoft.com/en-us/windows/win32/direct3d11/‌
  • Osd.D3D11StencilTable API文档: https://graphics.pixar.com/opensubdiv/docs/_opensubdiv3_0_p_d3d11_stencil_table_8h_source.html