Один из моих индексов не имеет правильных координат в DirectX11.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Один из моих индексов не имеет правильных координат в DirectX11.

Сообщение Anonymous »

Я пытаюсь создать треугольник с помощью 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»