DirectX / C ++: координаты текстуры не «правильные» в двигателе правильно после экспорта Obj

Если я рисую одну плоскость, координаты текстуры отображаются правильно. (4 верста, 4 TC, 6 индексов (2 полиса))

Даже если это подразделено, (9 Verts, 9 TC, 27 Indices (8 polys)) текстура будет отображаться:
введите описание изображения здесь

(Майя сложный самолет)
введите описание изображения здесь

Я могу взять свой [написанный] Obj-конвертер и загрузить координаты текстуры в буфер. Однако, если я вытягиваю грань в Maya и даже применяю планарную УФ-карту для «ремонта» сломанных ультрафиолетовых лучей (выше), координаты текстуры в двигателе становятся действительно дикими. (ниже)
введите описание изображения здесь

Есть ли проблема с форматом координат текстуры Obj?

Обновление: я нарисовал с D3D11_PRIMITIVE_TOPOLOGY_LINELIST и также заметил изменение в индексации ..введите описание изображения здесь Будет ли это проблемой? или я должен восстановить текстурные координаты, как нанесено на http://www.gamedev.net/topic/600234-texcoord-count-is-different-than-vertex-count/

2

Решение

Эта проблема была вызвана тем, что индекс координат текстуры не равен индексу вершины. Чтобы решить проблему, нужно было упорядочить индекс координат текстуры так, чтобы он совпадал с индексом вершины.

Для этой проблемы я смог решить, используя метод грубой силы, который подходит моему пониманию, который является медленным, который каталогизирует все координаты вершины / текстуры в качестве ключа и восстанавливает полный явный массив вершин и координат текстуры по их индексам, заполняя пользовательская структура, которая соответствует потребностям моего приложения.

введите описание изображения здесь

Есть другие более быстрые решения, которые включают использование хеша
http://programminglinuxgames.blogspot.com/2010/03/wavefront-obj-file-format-opengl-vertex.html

Связанная проблема с нормалями:
OpenGL — индекс буферизует трудности

А также 3 индексных буфера

И хорошее объяснение:
Почему мой OBJ-парсер рендерит меши так?

И дальнейшие ресурсы в формате obj:
http://en.wikipedia.org/wiki/Wavefront_.obj_file

OBJ ресурсы:
http://www.martinreddy.net/gfx/3d/OBJ.spec
http://www.fileformat.info/format/wavefrontobj/egff.htm

Кроме того, руководство по MeshFromObj10 из библиотеки DirectX помогает некоторым, эффективно и эффективно. Нет простого способа обойти это, кроме как найти сторонний источник.

3

Другие решения

Проверьте эти вещи, это может помочь вам:

DirectX использует левосторонние системы координат. Я думаю, вы получите правую систему координат из Maya / 3ds Max при экспорте в .obj файлы
: //Msdn.microsoft.com/en-us/library/windows/desktop/bb204853 (v = vs.85) .aspx

Сравните количество вертек в Maya, а затем в вашей программе.

Выясните причину, по которой вы получаете 1.000671 в ваших координатах TU / TV, похоже, это немного выше.

Убедитесь, что вы экспортируете как треугольники, а не прямоугольники.

Покажите ваши нормали в Maya, похоже, что какая-то часть земли / прямоугольника, на которой стоит этот объект, отсутствует. Или вы можете попробовать отключить выбраковку в вашем D3D11_RASTERIZER_DESC.

На моем компьютере сейчас не установлен Maya, но я думаю, что вы можете получить там графическое представление, которое показывает точные координаты TU / TV на вашей текстуре.

http: //www.youtube.com/watch? v = T-fFpmBYP_Q Это представление отображается в этом видео в 4,21.

РЕДАКТИРОВАТЬ:

Предоставление некоторых примеров кода:

struct D3D11TextureVertexType
{
XMFLOAT3 Position;
XMFLOAT2 TX;
};

Вот как вы можете поместить вершины в трубу:

hr = m_pd3dImmediateContext->Map(MyID3D11Buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if (FAILED(hr)) return hr;

pData = (D3D11TextureVertexType*)mappedResource.pData;
memcpy(pData, MYOBJECTVERTICES/*this is D3D11TextureVertexType*/, sizeof(D3D11TextureVertexType) * VertexCount);

m_pd3dImmediateContext->Unmap(MyID3D11Buffer, 0);

stride = sizeof(D3D11TextureVertexType);
offset = 0;

m_pd3dImmediateContext->IASetVertexBuffers(0, 1, &MyID3D11Buffer, &stride, &offset);
m_pd3dImmediateContext->IASetIndexBuffer(m_AdjRectangleIBuffer, DXGI_FORMAT_R32_UINT, 0);
m_pd3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

result = m_TextureShader->Render(m_pd3dImmediateContext, 6, worldMatrix, viewMatrix, orthoMatrix, m_Textures[Q.textureID]->pSRV);           if (!result)
{
return S_FALSE;
}

Это некоторые интересные функции в TextureShaderClass

bool Render(ID3D11DeviceContext* deviceContext, int indexCount, DirectX::CXMMATRIX worldMatrix, DirectX::CXMMATRIX viewMatrix, DirectX::CXMMATRIX projectionMatrix, ID3D11ShaderResourceView* texture)
{
bool result;

result = SetShaderParameters(deviceContext, worldMatrix, viewMatrix, projectionMatrix, texture);
if (!result)
{
return false;
}

RenderShader(deviceContext, indexCount);

return true;
}

bool InitializeShader(ID3D11Device* device, const WCHAR* filename)
{
HRESULT result;
ID3D10Blob* errorMessage;
ID3D10Blob* vertexShaderBuffer;
ID3D10Blob* pixelShaderBuffer;
D3D11_INPUT_ELEMENT_DESC polygonLayout[2];
unsigned int numElements;
D3D11_BUFFER_DESC matrixBufferDesc;
D3D11_SAMPLER_DESC samplerDesc;

errorMessage = 0;
vertexShaderBuffer = 0;
pixelShaderBuffer = 0;result = D3DCompileFromFile(filename, NULL, NULL, "TextureVertexShader", "vs_5_0", 0, 0, &vertexShaderBuffer, &errorMessage);
if (FAILED(result))
{
if (errorMessage)
{
//OutputShaderErrorMessage(errorMessage, hwnd, filename);
}
else
{
MessageBox(0, filename, L"Missing Shader File", MB_OK);
}

return false;
}

result = D3DCompileFromFile(filename, NULL, NULL, "TexturePixelShader", "ps_5_0", 0, 0, &pixelShaderBuffer, &errorMessage);
if (FAILED(result))
{
if (errorMessage)
{
//OutputShaderErrorMessage(errorMessage, hwnd, psFilename);
}
else
{
MessageBox(0, filename, L"Missing Shader File", MB_OK);
}

return false;
}

result = device->CreateVertexShader(vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), NULL, &m_vertexShader);
if (FAILED(result))
{
return false;
}

result = device->CreatePixelShader(pixelShaderBuffer->GetBufferPointer(), pixelShaderBuffer->GetBufferSize(), NULL, &m_pixelShader);
if (FAILED(result))
{
return false;
}

polygonLayout[0].SemanticName = "POSITION";
polygonLayout[0].SemanticIndex = 0;
polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT;
polygonLayout[0].InputSlot = 0;
polygonLayout[0].AlignedByteOffset = 0;
polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
polygonLayout[0].InstanceDataStepRate = 0;

polygonLayout[1].SemanticName = "TEXCOORD";
polygonLayout[1].SemanticIndex = 0;
polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT;
polygonLayout[1].InputSlot = 0;
polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
polygonLayout[1].InstanceDataStepRate = 0;

numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]);

result = device->CreateInputLayout(polygonLayout, numElements, vertexShaderBuffer->GetBufferPointer(), vertexShaderBuffer->GetBufferSize(), &m_layout);
if (FAILED(result))
{
return false;
}

vertexShaderBuffer->Release();
vertexShaderBuffer = 0;

pixelShaderBuffer->Release();
pixelShaderBuffer = 0;

matrixBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
matrixBufferDesc.ByteWidth = sizeof(MatrixBufferType);
matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
matrixBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
matrixBufferDesc.MiscFlags = 0;
matrixBufferDesc.StructureByteStride = 0;

result = device->CreateBuffer(&matrixBufferDesc, NULL, &m_matrixBuffer);
if (FAILED(result))
{
return false;
}

samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.MipLODBias = 0.0f;
samplerDesc.MaxAnisotropy = 1;
samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
samplerDesc.BorderColor[0] = 0;
samplerDesc.BorderColor[1] = 0;
samplerDesc.BorderColor[2] = 0;
samplerDesc.BorderColor[3] = 0;
samplerDesc.MinLOD = 0;
samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;

result = device->CreateSamplerState(&samplerDesc, &m_sampleState);
if (FAILED(result))
{
return false;
}

return true;
}
bool SetShaderParameters(ID3D11DeviceContext* deviceContext, DirectX::CXMMATRIX worldMatrix, DirectX::CXMMATRIX  viewMatrix, DirectX::CXMMATRIX  projectionMatrix, ID3D11ShaderResourceView* texture)
{
HRESULT result;
D3D11_MAPPED_SUBRESOURCE mappedResource;
MatrixBufferType* dataPtr;
unsigned int bufferNumber;

result = deviceContext->Map(m_matrixBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if (FAILED(result))
{
return false;
}

dataPtr = (MatrixBufferType*)mappedResource.pData;

DirectX::XMMATRIX world = worldMatrix;
world = XMMatrixTranspose(world);
DirectX::XMMATRIX view = viewMatrix;
view = XMMatrixTranspose(view);
DirectX::XMMATRIX projection = projectionMatrix;
projection = XMMatrixTranspose(projection);

dataPtr->world = world;
dataPtr->view = view;
dataPtr->projection = projection;

deviceContext->Unmap(m_matrixBuffer, 0);

bufferNumber = 0;

deviceContext->VSSetConstantBuffers(bufferNumber, 1, &m_matrixBuffer);

deviceContext->PSSetShaderResources(0, 1, &texture);

return true;
}

void RenderShader(ID3D11DeviceContext* deviceContext, int indexCount)
{
deviceContext->IASetInputLayout(m_layout);

deviceContext->VSSetShader(m_vertexShader, NULL, 0);
deviceContext->PSSetShader(m_pixelShader, NULL, 0);

deviceContext->PSSetSamplers(0, 1, &m_sampleState);

deviceContext->DrawIndexed(indexCount, 0, 0);

return;
}
2

Из Maya попробуйте реэкспортировать текстуру после выполнения выдавливания для правильного отображения в ультрафиолетовых лучах.

Выдавливание создает новые грани, и существующее ультрафиолетовое отображение не применяется к ним. Попробуйте использовать Geometry clean tool.

Насколько я понимаю, вы редактируете модель после того, как была создана UV-карта, а не обновляете UV-карту до экструдированного объекта (который все еще является планировщиком).

Вы также можете попробовать параметр expert all, который включает в себя текстуру, а не только модель в .obj

Хотя майя давно не использовал 🙁

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector