Я неоднократно рендерил трехмерные объекты в DirectX, но на этот раз столкнулся со странной проблемой, с которой я потратил день на выяснение, и до сих пор ничего не имею.У меня есть DX11 Context, в котором я загружаю 3d модели из файлов obj.Мне пришлось сделать скайбокс, и я понял, что хорошей отправной точкой будет попытка визуализировать куб, а затем продолжить.Мой графический конвейер рисует много вещей, поэтому, если я намеренно не отсоединю индексный шейдер, он останется связанным.Если я пытаюсь отобразить куб с привязанным индексным буфером моего куба, это не сработает.Но если я не связываю индексный буфер, он использует ранее связанный буфер (насколько я могу разобрать) и отображает вершины странным образом, как и ожидалось.Я, должно быть, здесь что-то упускаю.Я провел часы и часы и все еще не мог решить проблему.Я был бы признателен, если бы кто-то мог помочь ...
PS: я использую эти странные индексы только для тестирования, так как я предполагал, что они вызывают проблему.
Я весьма озадачен этимповедение, я должен что-то здесь упустить.
void SkyBox::CreateShader(Vertex * verts, size_t size_of_verts, WORD* indices, size_t size_of_indices)
{
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Shader Compilation ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ID3D10Blob* VS = nullptr;
ID3D10Blob* PS = nullptr;
ID3D10Blob* ErrMSG = nullptr;
D3DX11CompileFromFile("SkyShader.shader", 0, 0, "SKYMAP_VS", "vs_4_0", 0, 0, 0, &VS, &ErrMSG, 0);
D3DX11CompileFromFile("SkyShader.shader", 0, 0, "SKYMAP_PS", "ps_4_0", 0, 0, 0, &PS, &ErrMSG, 0);
char* p = new char[100];
// encapsulate both shaders into shader objects
if (!ErrMSG && VS && PS)
{
pRenderer->GetDevice()->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), nullptr, &pVertexShader);
pRenderer->GetDevice()->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), nullptr, &pPixelShader);
}
else
{
ELOG("The Shader file cannot be compiled. Please run this executable from the directory that contains the Shader file.");
exit(1);
}
D3D11_INPUT_ELEMENT_DESC IED[] =
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
UINT numElements = ARRAYSIZE(IED);
pRenderer->GetDevice()->CreateInputLayout(IED, 2, VS->GetBufferPointer(), VS->GetBufferSize(), &pLayout);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Vertex Buffer ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DYNAMIC;
bd.ByteWidth = size_of_verts;
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
D3D11_SUBRESOURCE_DATA InitData;
ZeroMemory(&InitData, sizeof(InitData));
InitData.pSysMem = verts;
pRenderer->GetDevice()->CreateBuffer(&bd, &InitData, OUT &pVBuffer); // creating the buffer
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Index Buffer /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = size_of_indices;
bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
bd.CPUAccessFlags = 0;
ZeroMemory(&InitData, sizeof(InitData));
InitData.pSysMem = indices;
pRenderer->GetDevice()->CreateBuffer(&bd, &InitData, OUT &pIBuffer);
}
SkyBox::SkyBox()
{
}
SkyBox::SkyBox(CRenderer * pRenderer)
:
pRenderer(pRenderer)
{
}
void SkyBox::CreateTri()
{
Vertex verts[]
{
{-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{ 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f},
{-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, 0.0f}
};
WORD indices[] {
0, 1, 2,
3, 4, 5,
6, 7, 8,
9, 10, 11,
12, 13, 14,
15, 16, 17,
18, 19, 20,
21, 22, 23,
24, 25, 26,
27, 28, 29,
30, 31, 32,
33, 34, 35,
};
CubeMesh Cube;
Cube.CreateMesh();
CreateShader(verts, sizeof(Vertex) * 36, indices, sizeof(WORD) * 36);
}
void SkyBox::Render()
{
const UINT vStride = sizeof(Vertex);
const UINT vOffset = 0;
pRenderer->GetDeviceContext()->VSSetShader(pVertexShader, 0, 0);
pRenderer->GetDeviceContext()->PSSetShader(pPixelShader, 0, 0);
pRenderer->GetDeviceContext()->IASetInputLayout(pLayout);
pRenderer->GetDeviceContext()->IASetVertexBuffers(0, 1, &pVBuffer, &vStride, &vOffset);
pRenderer->GetDeviceContext()->IASetIndexBuffer(pIBuffer, DXGI_FORMAT_R16_UINT, 0);
pRenderer->GetDeviceContext()->DrawIndexed(36, 0, 0);
}
And here's the shader
float4 SKYMAP_VS( float4 Pos : POSITION, float4 Norm : NORMAL ) : SV_POSITION
{
return Pos;
}
float4 SKYMAP_PS( float4 Pos : SV_POSITION ) : SV_Target
{
return float4( 1.0f, 1.0f, 0.0f, 1.0f );
}
// I don't know how it could be simpler...
```c++
In SkyBox::Render(), if i don't set the index buffer it uses the previously bound buffer (as mentioned before) but if i bind the buffer it literally draws nothing. And yes, the the index buffer is created successfully.