Anonymous
Один из моих индексов не имеет правильных координат в DirectX11.
Сообщение
Anonymous » 21 май 2024, 20:16
Я пытаюсь создать треугольник с помощью DirectX 11. Треугольник также нормально загружается с вершинами, однако только 2 из 3 вершин работают. Я имею в виду, что третья вершина по какой-то причине не перемещается в соответствии с введенными мной координатами, а просто остается в начале координат.
Это мой файл треугольника.cpp< /p>
Код: Выделить всё
#include "d3d.h"
void D3D::initTriangleShader() {
HRESULT hr;
ID3DBlob* pVertexShader = NULL;
hr = D3DX10CompileFromFile(L"VertexShader.hlsl", 0, 0, "main", "vs_5_0", 0, 0, 0, &pVertexShader, 0, 0);
if (FAILED(hr)) {
MessageBox(NULL, L"Error", L"Couldn't compile Vertex Shader", MB_OK);
exit(-1);
}
hr = dev->CreateVertexShader(pVertexShader->GetBufferPointer(), pVertexShader->GetBufferSize(), NULL, &vertexShader);
if (FAILED(hr)) {
MessageBox(NULL, L"Error", L"Couldn't Create Vertex Shader", MB_OK);
exit(-1);
}
ID3D10Blob* pPixelShader = NULL;
hr = D3DX10CompileFromFile(L"PixelShader.hlsl", 0, 0, "main", "ps_5_0", 0, 0, 0, &pPixelShader, 0, 0);
if (FAILED(hr)) {
MessageBox(NULL, L"Error", L"Couldn't load Pixel Shader", MB_OK);
exit(-1);
}
hr = dev->CreatePixelShader(pPixelShader->GetBufferPointer(), pPixelShader->GetBufferSize(), NULL, &pixelShader);
if (FAILED(hr)) {
MessageBox(NULL, L"Error", L"Couldn't create Pixel Shader", MB_OK);
exit(-1);
}
D3D11_INPUT_ELEMENT_DESC inputLayoutDesc[] = {
{"POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
};
UINT size = ARRAYSIZE(inputLayoutDesc);
hr = dev->CreateInputLayout(inputLayoutDesc, size, pVertexShader->GetBufferPointer(), pVertexShader->GetBufferSize(),
&layout);
if (FAILED(hr)) {
MessageBox(NULL, L"Error", L"Couldn't create Input Layout", MB_OK);
exit(-1);
}
}
void D3D::initTriangleBuffer() {
HRESULT hr;
triangle vertices[] = {
{XMFLOAT3(0.0f, 0.5f, 0.0f)},
{XMFLOAT3(0.5f, 0.5f, 0.0f)},
{XMFLOAT3(0.2f, 0.0f, 0.0f)},
};
D3D11_BUFFER_DESC bufferDesc;
ZeroMemory(&bufferDesc, sizeof(D3D11_BUFFER_DESC));
bufferDesc.ByteWidth = sizeof(triangle) * 3;
bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
D3D11_SUBRESOURCE_DATA subResourceData;
ZeroMemory(&subResourceData, sizeof(D3D11_SUBRESOURCE_DATA));
subResourceData.pSysMem = vertices;
hr = dev->CreateBuffer(&bufferDesc, &subResourceData, &vertexBuffer);
if (FAILED(hr)) {
MessageBox(NULL, L"Error", L"Couldn't create Buffer", MB_OK);
exit(-1);
}
DWORD indices[] = {
0, 1, 2,
};
D3D11_BUFFER_DESC indicesDesc;
ZeroMemory(&indicesDesc, sizeof(D3D11_BUFFER_DESC));
indicesDesc.ByteWidth = 3 * sizeof(DWORD);
indicesDesc.Usage = D3D11_USAGE_DYNAMIC;
indicesDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
indicesDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
D3D11_SUBRESOURCE_DATA indicesSubData;
ZeroMemory(&indicesSubData, sizeof(D3D11_SUBRESOURCE_DATA));
indicesSubData.pSysMem = indices;
hr = dev->CreateBuffer(&indicesDesc, &indicesSubData, &indexBuffer);
if (FAILED(hr)) {
MessageBox(NULL, L"Error", L"Couldn't create Index Buffer", MB_OK);
exit(-1);
}
}
void D3D::renderTriangle() {
devCon->IASetInputLayout(layout);
UINT stride = sizeof(triangle);
UINT offset = 0;
devCon->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
devCon->IASetIndexBuffer(indexBuffer, DXGI_FORMAT_R32_UINT, 0);
devCon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
devCon->VSSetShader(vertexShader, 0, 0);
devCon->PSSetShader(pixelShader, 0, 0);
devCon->DrawIndexed(3, 0, 0);
}
Я также хотел бы добавить файлы пиксельных и вершинных шейдеров
VertexShader.hlsl
Код: Выделить всё
struct VS_input
{
float3 inPos : POSITION;
};
struct VS_output
{
float4 outPos : SV_Position;
};
VS_output main(VS_input input)
{
VS_output output;
output.outPos = float4(input.inPos, 1.0f);
return output;
}
PixelShader.hlsl
Код: Выделить всё
float4 main() : SV_TARGET
{
return float4(1.0f, 1.0f, 1.0f, 1.0f);
}
Хотел бы также добавить, что из двух работающих вершин, когда я пытаюсь поместить их в отрицательную часть оси X, треугольник перестает рендериться все вместе
Подробнее здесь:
https://stackoverflow.com/questions/785 ... -directx11
1716311763
Anonymous
Я пытаюсь создать треугольник с помощью DirectX 11. Треугольник также нормально загружается с вершинами, однако только 2 из 3 вершин работают. Я имею в виду, что третья вершина по какой-то причине не перемещается в соответствии с введенными мной координатами, а просто остается в начале координат. Это мой файл треугольника.cpp< /p> [code]#include "d3d.h" void D3D::initTriangleShader() { HRESULT hr; ID3DBlob* pVertexShader = NULL; hr = D3DX10CompileFromFile(L"VertexShader.hlsl", 0, 0, "main", "vs_5_0", 0, 0, 0, &pVertexShader, 0, 0); if (FAILED(hr)) { MessageBox(NULL, L"Error", L"Couldn't compile Vertex Shader", MB_OK); exit(-1); } hr = dev->CreateVertexShader(pVertexShader->GetBufferPointer(), pVertexShader->GetBufferSize(), NULL, &vertexShader); if (FAILED(hr)) { MessageBox(NULL, L"Error", L"Couldn't Create Vertex Shader", MB_OK); exit(-1); } ID3D10Blob* pPixelShader = NULL; hr = D3DX10CompileFromFile(L"PixelShader.hlsl", 0, 0, "main", "ps_5_0", 0, 0, 0, &pPixelShader, 0, 0); if (FAILED(hr)) { MessageBox(NULL, L"Error", L"Couldn't load Pixel Shader", MB_OK); exit(-1); } hr = dev->CreatePixelShader(pPixelShader->GetBufferPointer(), pPixelShader->GetBufferSize(), NULL, &pixelShader); if (FAILED(hr)) { MessageBox(NULL, L"Error", L"Couldn't create Pixel Shader", MB_OK); exit(-1); } D3D11_INPUT_ELEMENT_DESC inputLayoutDesc[] = { {"POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}, }; UINT size = ARRAYSIZE(inputLayoutDesc); hr = dev->CreateInputLayout(inputLayoutDesc, size, pVertexShader->GetBufferPointer(), pVertexShader->GetBufferSize(), &layout); if (FAILED(hr)) { MessageBox(NULL, L"Error", L"Couldn't create Input Layout", MB_OK); exit(-1); } } void D3D::initTriangleBuffer() { HRESULT hr; triangle vertices[] = { {XMFLOAT3(0.0f, 0.5f, 0.0f)}, {XMFLOAT3(0.5f, 0.5f, 0.0f)}, {XMFLOAT3(0.2f, 0.0f, 0.0f)}, }; D3D11_BUFFER_DESC bufferDesc; ZeroMemory(&bufferDesc, sizeof(D3D11_BUFFER_DESC)); bufferDesc.ByteWidth = sizeof(triangle) * 3; bufferDesc.Usage = D3D11_USAGE_DYNAMIC; bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; D3D11_SUBRESOURCE_DATA subResourceData; ZeroMemory(&subResourceData, sizeof(D3D11_SUBRESOURCE_DATA)); subResourceData.pSysMem = vertices; hr = dev->CreateBuffer(&bufferDesc, &subResourceData, &vertexBuffer); if (FAILED(hr)) { MessageBox(NULL, L"Error", L"Couldn't create Buffer", MB_OK); exit(-1); } DWORD indices[] = { 0, 1, 2, }; D3D11_BUFFER_DESC indicesDesc; ZeroMemory(&indicesDesc, sizeof(D3D11_BUFFER_DESC)); indicesDesc.ByteWidth = 3 * sizeof(DWORD); indicesDesc.Usage = D3D11_USAGE_DYNAMIC; indicesDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; indicesDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; D3D11_SUBRESOURCE_DATA indicesSubData; ZeroMemory(&indicesSubData, sizeof(D3D11_SUBRESOURCE_DATA)); indicesSubData.pSysMem = indices; hr = dev->CreateBuffer(&indicesDesc, &indicesSubData, &indexBuffer); if (FAILED(hr)) { MessageBox(NULL, L"Error", L"Couldn't create Index Buffer", MB_OK); exit(-1); } } void D3D::renderTriangle() { devCon->IASetInputLayout(layout); UINT stride = sizeof(triangle); UINT offset = 0; devCon->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset); devCon->IASetIndexBuffer(indexBuffer, DXGI_FORMAT_R32_UINT, 0); devCon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); devCon->VSSetShader(vertexShader, 0, 0); devCon->PSSetShader(pixelShader, 0, 0); devCon->DrawIndexed(3, 0, 0); } [/code] Я также хотел бы добавить файлы пиксельных и вершинных шейдеров VertexShader.hlsl [code]struct VS_input { float3 inPos : POSITION; }; struct VS_output { float4 outPos : SV_Position; }; VS_output main(VS_input input) { VS_output output; output.outPos = float4(input.inPos, 1.0f); return output; } [/code] PixelShader.hlsl [code]float4 main() : SV_TARGET { return float4(1.0f, 1.0f, 1.0f, 1.0f); } [/code] Хотел бы также добавить, что из двух работающих вершин, когда я пытаюсь поместить их в отрицательную часть оси X, треугольник перестает рендериться все вместе Подробнее здесь: [url]https://stackoverflow.com/questions/78513434/one-of-my-indices-does-not-have-the-right-coordinates-in-directx11[/url]