Sign in to follow this  
BerserkIvix

DX12 C++ and the Universal Windows Platform

Recommended Posts

Hello everyone.
I have some background with C++, and I would like to code apps and games with it using the UWP (Universal Windows Platform).
Is there any book explaining how to do so?

I tried with Amazon but with no luck.

I know I could code with C#, but I can't make games unless I glue it to C++ and DirectX 12, so let's cut the edge and learn just C++.

 

Thanks in advance for either.

 

Bye, Ivano..

Edited by BerserkIvix

Share this post


Link to post
Share on other sites

Is the information on MSDN insufficient for you in some fashion? How so?

I can't make games unless I glue it to C++ and DirectX 12

You don't need to use D3D12 to make games, and in fact it's probably not a great idea unless you already know what you're doing and are already well-versed in graphics programming fundamentals.

You can also use wrappers like SharpDx to access D3D from C#.

Share this post


Link to post
Share on other sites

You can use "pure" C++ (without MS C++/CX extension) with C++/WinRT library: https://github.com/Microsoft/cppwinrt

Microsoft also published a start-template for DirectX 12 and C++/WinRT too: https://blogs.msdn.microsoft.com/chuckw/2017/02/11/directx-tool-kit-and-cwinrt/

Edited by Alessio1989

Share this post


Link to post
Share on other sites
We're going slightly ot here.
I'm looking for a book about windows 10 universal windows platform for c++.
Discard the directx knowledge required, but still keep in mind I also want to create 3d games on (in example) windows phone.
Or at least I want to know if it's possible even with c#.

Share this post


Link to post
Share on other sites

For the direct answer, I'm not aware of such a book.

 

However, I'm replying because from what I understand it isn't an issue in practice. Use the API calls you would normally use to build the game. The compiler and linker will give errors for using any of the short list of 'forbidden' functions, but otherwise you would develop your application the same as you normally would.

You'll want to start verifying your app as soon as possible with the App Certification Kit, but as long as you maintain a clean build it should work without any issues. 

When you encounter an error, either a traditional runtime function that isn't available in the Universal library or some other violation, you could look up that specific error and you'll likely find multiple solutions or workarounds.

Share this post


Link to post
Share on other sites

C# is kind of the more common thing for UWP. You can certainly code it in C++ as well but you'll have to rely on the MSDN and online tutorials as there are currently no books on it that I know of. Here is a tutorial specifically for UWP with DirectX and C++.

If your goal is to write games that run on Windows as well as Windows Phone, have you considered Unity? You'd have to use C# but you can definitely make 3D games with it and get them to run on those (and a gazillion other) platforms. I think they even added DX12 support recently. If you want to write and sell games then that may be a good way forward, as with DX12 you'll have to basically write at least three separate rendering engines from scratch (one for AMD, one for NVidia, and one for whatever the GPU used in Windows Phones is).

Share this post


Link to post
Share on other sites

Honestly if your goal is to make games and not engines, you should be using an engine, not pure API's.

It can take months to figure out D3D by itself, whereas something like Unity can have full 3d objects rolling around a level in minutes. Plus you have to write all the connecting game engine code.

Share this post


Link to post
Share on other sites

With Unreal you can code in C++. Among the Linux/Android/Vulkan support that's one of the many features.

Edited by mike44

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Forum Statistics

    • Total Topics
      628285
    • Total Posts
      2981836
  • Similar Content

    • By lubbe75
      I am looking for some example projects and tutorials using sharpDX, in particular DX12 examples using sharpDX. I have only found a few. Among them the porting of Microsoft's D3D12 Hello World examples (https://github.com/RobyDX/SharpDX_D3D12HelloWorld), and Johan Falk's tutorials (http://www.johanfalk.eu/).
      For instance, I would like to see an example how to use multisampling, and debugging using sharpDX DX12.
      Let me know if you have any useful examples.
      Thanks!
    • By lubbe75
      I'm writing a 3D engine using SharpDX and DX12. It takes a handle to a System.Windows.Forms.Control for drawing onto. This handle is used when creating the swapchain (it's set as the OutputHandle in the SwapChainDescription). 
      After rendering I want to give up this control to another renderer (for instance a GDI renderer), so I dispose various objects, among them the swapchain. However, no other renderer seem to be able to draw on this control after my DX12 renderer has used it. I see no exceptions or strange behaviour when debugging the other renderers trying to draw, except that nothing gets drawn to the area. If I then switch back to my DX12 renderer it can still draw to the control, but no other renderers seem to be able to. If I don't use my DX12 renderer, then I am able to switch between other renderers with no problem. My DX12 renderer is clearly messing up something in the control somehow, but what could I be doing wrong with just SharpDX calls? I read a tip about not disposing when in fullscreen mode, but I don't use fullscreen so it can't be that.
      Anyway, my question is, how do I properly release this handle to my control so that others can draw to it later? Disposing things doesn't seem to be enough.
    • By Tubby94
      I'm currently learning how to store multiple objects in a single vertex buffer for efficiency reasons. So far I have a cube and pyramid rendered using ID3D12GraphicsCommandList::DrawIndexedInstanced; but when the screen is drawn, I can't see the pyramid because it is drawn inside the cube. I'm told to "Use the world transformation matrix so that the box and pyramid are disjoint in world space".
       
      Can anyone give insight on how this is accomplished? 
       
           First I init the verts in Local Space
      std::array<VPosData, 13> vertices =     {         //Cube         VPosData({ XMFLOAT3(-1.0f, -1.0f, -1.0f) }),         VPosData({ XMFLOAT3(-1.0f, +1.0f, -1.0f) }),         VPosData({ XMFLOAT3(+1.0f, +1.0f, -1.0f) }),         VPosData({ XMFLOAT3(+1.0f, -1.0f, -1.0f) }),         VPosData({ XMFLOAT3(-1.0f, -1.0f, +1.0f) }),         VPosData({ XMFLOAT3(-1.0f, +1.0f, +1.0f) }),         VPosData({ XMFLOAT3(+1.0f, +1.0f, +1.0f) }),         VPosData({ XMFLOAT3(+1.0f, -1.0f, +1.0f) }),         //Pyramid         VPosData({ XMFLOAT3(-1.0f, -1.0f, -1.0f) }),         VPosData({ XMFLOAT3(-1.0f, -1.0f, +1.0f) }),         VPosData({ XMFLOAT3(+1.0f, -1.0f, -1.0f) }),         VPosData({ XMFLOAT3(+1.0f, -1.0f, +1.0f) }),         VPosData({ XMFLOAT3(0.0f,  +1.0f, 0.0f) }) } Then  data is stored into a container so sub meshes can be drawn individually
      SubmeshGeometry submesh; submesh.IndexCount = (UINT)indices.size(); submesh.StartIndexLocation = 0; submesh.BaseVertexLocation = 0; SubmeshGeometry pyramid; pyramid.IndexCount = (UINT)indices.size(); pyramid.StartIndexLocation = 36; pyramid.BaseVertexLocation = 8; mBoxGeo->DrawArgs["box"] = submesh; mBoxGeo->DrawArgs["pyramid"] = pyramid;  
      Objects are drawn
      mCommandList->DrawIndexedInstanced( mBoxGeo->DrawArgs["box"].IndexCount, 1, 0, 0, 0); mCommandList->DrawIndexedInstanced( mBoxGeo->DrawArgs["pyramid"].IndexCount, 1, 36, 8, 0);  
      Vertex Shader
       
      cbuffer cbPerObject : register(b0) { float4x4 gWorldViewProj; }; struct VertexIn { float3 PosL : POSITION; float4 Color : COLOR; }; struct VertexOut { float4 PosH : SV_POSITION; float4 Color : COLOR; }; VertexOut VS(VertexIn vin) { VertexOut vout; // Transform to homogeneous clip space. vout.PosH = mul(float4(vin.PosL, 1.0f), gWorldViewProj); // Just pass vertex color into the pixel shader. vout.Color = vin.Color; return vout; } float4 PS(VertexOut pin) : SV_Target { return pin.Color; }  

    • By mark_braga
      I am confused why this code works because the lights array is not 16 bytes aligned.
      struct Light {     float4 position;     float radius;     float intensity; // How does this work without adding // uint _pad0, _pad1; }; cbuffer lightData : register(b0) {     uint lightCount;     uint _pad0;     uint _pad1;     uint _pad2; // Shouldn't the shader be not able to read the second element in the light struct // Because after float intensity, we need 8 more bytes to make it 16 byte aligned?     Light lights[NUM_LIGHTS]; } This has erased everything I thought I knew about constant buffer alignment. Any explanation will help clear my head.
      Thank you
    • By HD86
      I don't know in advance the total number of textures my app will be using. I wanted to use this approach but it turned out to be impractical because D3D11 hardware may not allow binding more than 128 SRVs to the shaders. Next I decided to keep all the texture SRV's in a default heap that is invisible to the shaders, and when I need to render a texture I would copy its SRV from the invisible heap to another heap that is bound to the pixel shader, but this also seems impractical because ID3D12Device::CopyDescriptorsSimple cannot be used in a command list. It executes immediately when it is called. I would need to close, execute and reset the command list every time I need to switch the texture.
      What is the correct way to do this?
  • Popular Now