feat: 实现D3D12 RHI抽象层,修复PSO创建问题
- 添加RHI接口定义(IRHIDevice, ICommandList, IResource等) - 实现D3D12Device, D3D12CommandList, D3D12PipelineState等 - 修复RootSignature参数数量(3->4)与HelloEarth一致 - 修复DSV格式设置(Unknown->D24_UNorm_S8_UInt) - 添加Geometry Shader编译 - 创建XCEngineDemo项目验证RHI功能
This commit is contained in:
86
engine/src/RHI/D3D12/D3D12StaticMeshComponent.cpp
Normal file
86
engine/src/RHI/D3D12/D3D12StaticMeshComponent.cpp
Normal file
@@ -0,0 +1,86 @@
|
||||
#include <Rendering\StaticMeshComponent.h>
|
||||
#include <RHI\D3D12\D3D12Resources.h>
|
||||
#include <cstdio>
|
||||
|
||||
namespace XCEngine {
|
||||
namespace RHI {
|
||||
|
||||
StaticMeshComponent::StaticMeshComponent() {
|
||||
}
|
||||
|
||||
StaticMeshComponent::~StaticMeshComponent() {
|
||||
if (m_vertexBuffer) {
|
||||
delete m_vertexBuffer;
|
||||
}
|
||||
for (auto& pair : m_subMeshes) {
|
||||
delete pair.second;
|
||||
}
|
||||
}
|
||||
|
||||
bool StaticMeshComponent::Initialize(ICommandList* commandList, const char* filePath) {
|
||||
FILE* file = nullptr;
|
||||
if (fopen_s(&file, filePath, "rb") != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
int vertexCount = 0;
|
||||
fread(&vertexCount, 4, 1, file);
|
||||
m_vertexCount = vertexCount;
|
||||
|
||||
MeshVertex* vertices = new MeshVertex[vertexCount];
|
||||
fread(vertices, sizeof(MeshVertex), vertexCount, file);
|
||||
|
||||
D3D12Device* device = nullptr;
|
||||
|
||||
CreateVertexBuffer(device, commandList, vertices, sizeof(MeshVertex) * vertexCount, sizeof(MeshVertex), &m_vertexBuffer);
|
||||
|
||||
delete[] vertices;
|
||||
|
||||
while (!feof(file)) {
|
||||
int nameLength = 0;
|
||||
fread(&nameLength, 4, 1, file);
|
||||
if (feof(file)) break;
|
||||
|
||||
char name[256] = {0};
|
||||
fread(name, 1, nameLength, file);
|
||||
|
||||
int indexCount = 0;
|
||||
fread(&indexCount, 4, 1, file);
|
||||
|
||||
uint32_t* indices = new uint32_t[indexCount];
|
||||
fread(indices, sizeof(uint32_t), indexCount, file);
|
||||
|
||||
IIndexBuffer* indexBuffer = nullptr;
|
||||
CreateIndexBuffer(device, commandList, indices, sizeof(uint32_t) * indexCount, &indexBuffer);
|
||||
|
||||
delete[] indices;
|
||||
|
||||
SubMesh* submesh = new SubMesh();
|
||||
submesh->indexBuffer = indexBuffer;
|
||||
submesh->indexCount = indexCount;
|
||||
m_subMeshes[std::string(name)] = submesh;
|
||||
}
|
||||
|
||||
fclose(file);
|
||||
return true;
|
||||
}
|
||||
|
||||
void StaticMeshComponent::Render(ICommandList* commandList) {
|
||||
if (!m_vertexBuffer) return;
|
||||
|
||||
commandList->SetVertexBuffer(0, m_vertexBuffer, 0, sizeof(MeshVertex));
|
||||
|
||||
if (m_subMeshes.empty()) {
|
||||
commandList->DrawInstanced(m_vertexCount, 1, 0, 0);
|
||||
}
|
||||
else {
|
||||
for (auto& pair : m_subMeshes) {
|
||||
SubMesh* submesh = pair.second;
|
||||
commandList->SetIndexBuffer(submesh->indexBuffer, 0);
|
||||
commandList->DrawIndexedInstanced(submesh->indexCount, 1, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace RHI
|
||||
} // namespace XCEngine
|
||||
Reference in New Issue
Block a user