如何手动渲染带有DirectX工具包的网格



我有一个C /CX项目,我使用directx-11渲染过程网格,这一切似乎都很好,但是现在我也想从文件中导入和渲染网格(从FBX确切地说(。有人告诉我为此使用DirectX工具包。

我遵循工具包的教程,所有这些都起作用,但是后来我尝试在项目中这样做,但似乎没有用。进口网格不可见,现有的程序网格被错误地呈现(好像没有深度缓冲区(。

i然后尝试手动渲染导入的网格(与过程网格相同,而无需使用directxtk的draw函数(这样可以更好地工作,现有的网格都是正确的,但是导入的网格颜色是错误的。我使用一个自定义的顶点和片段着色器,它仅使用顶点位置和颜色数据,但是由于某种原因,导入的网格的正态被发送到着色器而不是顶点色。

(我什至不希望将正态存储在网格中,但是我似乎没有选择在没有正常的情况Directxtk似乎重新计算了正常的(

有人知道我在做什么吗?这对我来说仍然是相对较新的,因此任何帮助都对此表示赞赏。如果您需要更多信息,请告诉我。

这是我渲染网格的代码:

首先,主要渲染函数(每次更新一次称为(:

void Track3D::Render()
{
if (!_loadingComplete)
{
    return;
}
static const XMVECTORF32 up = { 0.0f, 1.0f, 0.0f, 0.0f };
// Prepare to pass the view matrix, and updated model matrix, to the shader
XMStoreFloat4x4(&_constantBufferData.view, XMMatrixTranspose(XMMatrixLookAtRH(_CameraPosition, _CameraLookat, up)));
// Clear the back buffer and depth stencil view.
_d3dContext->ClearRenderTargetView(_renderTargetView.Get(), DirectX::Colors::Transparent);
_d3dContext->ClearDepthStencilView(_depthStencilView.Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
// Set render targets to the screen.
ID3D11RenderTargetView *const targets[1] = { _renderTargetView.Get() };
_d3dContext->OMSetRenderTargets(1, targets, _depthStencilView.Get());
// Here I render everything:
_TrackMesh->Render(_constantBufferData);
RenderExtra();
_ImportedMesh->Render(_constantBufferData);
Present();
}

现在功能:

void Track3D::Present()
{
DXGI_PRESENT_PARAMETERS parameters = { 0 };
parameters.DirtyRectsCount = 0;
parameters.pDirtyRects = nullptr;
parameters.pScrollRect = nullptr;
parameters.pScrollOffset = nullptr;
HRESULT hr = S_OK;
hr = _swapChain->Present1(1, 0, &parameters);
if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET)
{
    OnDeviceLost();
}
else
{
    if (FAILED(hr))
    {
        throw Platform::Exception::CreateException(hr);
    }
}
}

这是我在每个网格上称呼的渲染功能:(从导入的网格中获取所有网格特异性数据(

void Mesh::Render(ModelViewProjectionConstantBuffer constantBufferData)
{
if (!_loadingComplete)
{
    return;
}
XMStoreFloat4x4(&constantBufferData.model, XMLoadFloat4x4(&_modelMatrix));  
// Prepare the constant buffer to send it to the Graphics device.
_d3dContext->UpdateSubresource(
    _constantBuffer.Get(),
    0,
    NULL,
    &constantBufferData,
    0,
    0
);
UINT offset = 0;
_d3dContext->IASetVertexBuffers(
    0,
    1,
    _vertexBuffer.GetAddressOf(),
    &_stride,
    &_offset
);
_d3dContext->IASetIndexBuffer(
    _indexBuffer.Get(),
    DXGI_FORMAT_R16_UINT, // Each index is one 16-bit unsigned integer (short).
    0
);
_d3dContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
_d3dContext->IASetInputLayout(_inputLayout.Get());
// Attach our vertex shader.
_d3dContext->VSSetShader(
    _vertexShader.Get(),
    nullptr,
    0
);
// Send the constant buffer to the Graphics device.
_d3dContext->VSSetConstantBuffers(
    0,
    1,
    _constantBuffer.GetAddressOf()
);
// Attach our pixel shader.
_d3dContext->PSSetShader(
    _pixelShader.Get(),
    nullptr,
    0
);  
SetTexture();
// Draw the objects.
_d3dContext->DrawIndexed(
    _indexCount,
    0,
    0
);
}

这是顶点着色器:

cbuffer ModelViewProjectionConstantBuffer : register(b0)
{
matrix model;
matrix view;
matrix projection;
};
struct VertexShaderInput
{
float3 pos : POSITION;
//float3 normal : NORMAL0; //uncommenting these changes the color data for some reason (but always wrong)
//float2 uv1 : TEXCOORD0;
//float2 uv2 : TEXCOORD1;
float3 color : COLOR0;
};
struct VertexShaderOutput
{
float3 color : COLOR0;
float4 pos : SV_POSITION;
};
VertexShaderOutput main(VertexShaderInput input)
{
VertexShaderOutput output;
float4 pos = float4(input.pos, 1.0f);
// Transform the vertex position into projected space.
pos = mul(pos, model);
pos = mul(pos, view);
pos = mul(pos, projection);
output.pos = pos;
output.color = input.color;
return output;
}

这是像素着色器:

struct PixelShaderInput
{
    float3 color: COLOR0;
};
float4 main(PixelShaderInput input) : SV_TARGET
{
    return float4(input.color.r, input.color.g, input.color.b, 1);
}

最有可能的问题是,您没有为图纸设置足够的状态,并且 directx工具套件绘图功能是设置不匹配的状态您现有的代码需要什么。

出于性能原因, directx工具套件不保存&恢复状态。相反,每个绘制功能都设置了完全需要的状态,然后将其留下。我记录了每个班级的州管理部分在Wiki中受到影响的哪个状态。

上面的代码设置顶点缓冲区,索引缓冲区,输入布局,顶点着色器,像素着色器,原始拓扑和vs vs vs vs n slot中的恒定缓冲区。

您做过设置了混合状态,深度/模板状态或rasterizer状态。您没有提供像素着色器,所以我不知道您是否需要任何PS常量缓冲器,采样器或着色器资源。

在绘制过程网格之前,请尝试明确设置混合状态,深度/模板状态和栅格状态。如果您只想返回到定义的默认值,而不是任何 directx工具套件 ,请致电:

_d3dContext->RSSetState(nullptr);
_d3dContext->OMSetBlendState(nullptr, nullptr, 0);
_d3dContext->OMSetDepthStencilState(nullptr, 0xffffffff);

另请参见普通状态类。

通常使用C 中_的标识符不是一个好主意。正式的所有以_X开头的标识符,其中X是大写字母或__,均为编译器和图书馆实施者保留,以便它可能与某些编译器的内容相抵触。m_或类似的东西更好。

相关内容

  • 没有找到相关文章

最新更新