Hello!
I'm having a difficult time deciding if I'm going to learn DirectX11 or DirectX12. Since I want to get a job in game development when I finish my studies, it feels like I would leave a better impression on the company if I've created something in DirectX12, since that's the more performant API. At the same time, DirectX12 is a bit frustrating sometimes, because it feels like every struct I fill in constists on another struct that consists of another struct and some parts just feel overly complicated. I've used DirectX11 for a while, and it feels a bit easier to use, but at the same time I don't want to base my decision only on what's more easy, but also what's better for my carrer.
So basically, this topic boils down into 2 different questions:
- Should I learn DirectX11 or DirectX12 in regards to what's better for my future career?
- Is really DirectX12 that much more difficult than DirectX11, or is it a combination of me being unfimiliar with the new names/concepts, and/or me overcomplicating things?
In regards to point 1, my aim is to produce some kind of hobby projects, either a lightweight game engine, or some standalone demos, that I can use as a portfolio when I search for a future job. Is this a good approach or am I thinking entirely wrong? Would a company find it more impressing that I've used an existing engine to write a small game, or would they find it more impressing that I've written a small engine in DirectX12?
In regards to point 2, I don't find the whole CPU-GPU parallelism so difficult to understand, but rather the way of initializing everything and knowing what I should initialize and the best way to do it. Also there're some concepts that I think are overly complicated, either because I don't understand it, or well because they're overly complicated. This is easier explained with a few examples.
One example is the new pipeline state object (PSO) in DirectX12 that's confusing me a bit. At first I thought the idea of setting up a struct rather than using loads of function calls was a great idea, but the further I tried it out I noticed that now I had to set up things both in the PSO and with the functions. For example, I can set the primitive topology in the PSO:
pipelineStateDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;
But then in my render function I still need set the primitive topology individually:
m_commandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
Same applies to the root signature:
pipelineStateDesc.pRootSignature = m_rootSignature;
And then in my render function I need to do it again:
m_commandList->SetGraphicsRootSignature(m_rootSignature);
And then there's also the whole part of filling in struct after struct to describe CBV/SRV/UAV inputs to a shader, and then in the render function I still have to call a function:
m_commandList->SetGraphicsRootDescriptorTable(0, m_constantBufferHeap->GetGPUDescriptorHandleForHeapStart());
Also the whole part of setting up differend heaps for different descriptors feels so unnecessarily complicated.
So to get to the point instead of complaining about it, is it supposed to be like this or am I doing something very wrong here? And while I understand that this might be a difficult question to answer, is it actually this complicated, or does it just feel like that because it's new concepts and names for me?
Thank you for taking the time to read this and thank you in advance for helping me out.