Sign in to follow this  
Phobon

DX11 [SlimDX] DX11 - Load cube texture from dds-file

Recommended Posts

Phobon    247
Hi! Is there a way to load a cube-texture from a dds-file into SlimDX (at Direct3D11)? At the moment, I'm forced to use a self-modified SlimDX version that can create a ShaderResourceView using D3DX11CreateShaderResourceViewFromFile from the unmanaged API. But now I'm wondering if there's an "official" way to do this ( that I just haven't found ) or whether this functionality might be integrated into the next official release? Thanks! Fabian

Share this post


Link to post
Share on other sites
Mike.Popoloski    3258
ShaderResourceView.FromFile was added in a recent commit to the repository. The alternative is to load the texture separately and then create the resource view from that.

Cube textures in D3D10 and D3D11 are supported through the more generic "texture arrays". Loading your image as an array of 2D textures will allow you to achieve the same result.

Share this post


Link to post
Share on other sites
efreette    100
I am having the same problem. I can't figure out how would I go about loading a DDS file into a texture array. Could you elaborate a little bit more on this topic? Would you perhaps be willing to post a code snippet demonstrating how to load a texture cube from a DDS file and pass it on to the pixel shader? I have to say, the transition from DX9 is not a cakewalk...

Share this post


Link to post
Share on other sites
Starnick    1892
Loading a DDS Cubemap from file using the API or loading it yourself? If from the API:

[code]

Device device;
String fileName;

...

ImageLoadInformation loadInfo = new ImageLoadInformation();
loadInfo.OptionFlags = ResourceOptionFlags.TextureCube;

Texture2D tex2D = Texture2D.FromFile(device, fileName);
ShaderResourceView srView = new ShaderResourceView(device, tex2D);
[/code]

Notice, just like Mike said, Cube maps are really just texture2d arrays (so there's no special texture cube object), where the array has 6 textures representing each face. If you're loading the DDS file yourself, you can create an empty cube texture like so:

[code]
Texture2DDescription descTex = new Texture2DDescription();
descTex.ArraySize = 6;
descTex.Width = 512;
descTex.Height = 512;
descTex.Usage = ResourceUsage.Default;
descTex.CpuAccessFlags = CpuAccessFlags.None;
descTex.Format = Format.R8G8B8A8_UNorm;
descTex.SampleDescription = new SampleDescription(1, 0);
descTex.MipLevels = 1;
descTex.BindFlags = D3D.BindFlags.ShaderResource;
descTex.OptionFlags = D3D.ResourceOptionFlags.TextureCube;

Texture2D texture2D = new Texture2D(graphicsDevice, descTex);
ShaderResourceView shaderResourceView = new ShaderResourceView(graphicsDevice, texture2D);
[/code]

Share this post


Link to post
Share on other sites
efreette    100
Thanks!

I've managed to render my scene, but there's one thing I'm still trying to figure out - is there a way to bind the texture to the shader using the shader variable name? For now, I've just typed:

[code]Device device;

String texturePath;


...

ImageLoadInformation loadInfo = new ImageLoadInformation();

loadInfo.OptionFlags = ResourceOptionFlags.TextureCube;

texture = Texture2D.FromFile(device, texturePath);

textureResourceView = new ShaderResourceView(device, texture);

device.ImmediateContext.PixelShader.SetShaderResource(textureResourceView, 0);[/code]


I've found someone else's solution here: [url="http://www.gamedev.net/topic/592005-slimdx--textures-on-the-simpletriangle/"][slimDX] textures on the simpletriangle[/url] but the code seems kind of messy with the shaders being compiled twice...

Share this post


Link to post
Share on other sites
Starnick    1892
You pretty much have two options:

1. Use the effects framework (write FX files and not individual vertex/pixel HLSL fragments). Then, you can query an EffectResourceVariable from the Effect by index, by name or by semantic, so if you have "DiffuseMap" as your texture resource name, then myEffect.GetVariableByName("DiffuseMap") would return an EffectVariable. Then you'd call AsResource() to cast it into an EffectResourceVariable, which has a SetResource(ShaderResourceView) method. I'd strongly advise reviewing the official SlimDX docs as you they would help in following/understanding this progression.

Note: The effects framework is built ontop of all the regular shader API, you can choose not to use it and set your shaders and their variables manually (or create a replacement of the effects framework even), just like what you're doing.

2. Use shader reflection classes from the SlimDX.D3DCompiler namespace. You can create a ShaderReflection object by using your shader's byte code, which allows you to query info about your shader. What you're looking for is the shaderReflection.GetResourceBindingDescription(int) method. Loop over each resource (the shader reflection description will have a resource count), and the resource binding description will have a name you can use.

The shader reflection API is pretty powerful, albeit in my opinion a bit cumbersome to navigate if you haven't touched it before. But it can be a useful tool as you can query all sorts of things about your variables and shaders. Although I use the effects framework, I do use shader reflection to build an input layout when I load my shaders, for an example.

Edit: I should also mention, with option #2 you still will be setting the shader resource views via an index in the *ShaderWrapper classes. But you can use what you find out from the shader reflection queries in a custom setup where you associate those indices with resource names. This is why using the effects framework is easier, as it does this sort of book keeping for you automatically.

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  

  • Similar Content

    • By RubenRS
      How do i open an image to use it as Texture2D information without D3DX11CreateShaderResourceViewFromFile? And how it works for different formats like (JPG, PNG, BMP, DDS,  etc.)?
      I have an (512 x 512) image with font letters, also i have the position and texcoord of every letter. The main idea is that i want to obtain the image pixel info, use the position and texcoords to create a new texture with one letter and render it. Or am I wrong in something?
    • By thmfrnk
      Hey,
      I found a very interesting blog post here: https://bartwronski.com/2017/04/13/cull-that-cone/
      However, I didn't really got how to use his "TestConeVsSphere" test in 3D (last piece of code on his post). I have the frustumCorners of a 2D Tile cell in ViewSpace and my 3D Cone Origin and Direction, so where to place the "testSphere"? I thought about to also move the Cone into viewspace and put the sphere to the Center of the Cell with the radius of half-cellsize, however what about depth? A sphere does not have inf depth?
      I am missing anything? Any Ideas?
      Thx, Thomas
    • By Modymek
      hi all
      I want to enable and disable shader in MPCH Media player Classic
      the MPCH have shader option using HLSL shaders
      I want the shader to read each file extension before it plays the file
      so if the video file name is video.GR.Mp4 it will play it in Grayscale shader 
      if it is not and standard file name Video.Mp4 without GR. unique extension so it plays standard without shader or end the shader
      here is the shader I have for grayscale
      // $MinimumShaderProfile: ps_2_0
      sampler s0 : register(s0);
      float4 main(float2 tex : TEXCOORD0) : COLOR {
          float c0 = dot(tex2D(s0, tex), float4(0.299, 0.587, 0.114, 0));
          return c0;
      }
       
      I want to add if or block stantement or bloean to detect file name before it call the shader in order to go to the procedure or disable it or goto end direct without it
       
      any thoughts or help
    • By noodleBowl
      I've gotten to part in my DirectX 11 project where I need to pass the MVP matrices to my vertex shader. And I'm a little lost when it comes to the use of the constant buffer with the vertex shader
      I understand I need to set up the constant buffer just like any other buffer:
      1. Create a buffer description with the D3D11_BIND_CONSTANT_BUFFER flag 2. Map my matrix data into the constant buffer 3. Use VSSetConstantBuffers to actually use the buffer But I get lost at the VertexShader part, how does my vertex shader know to use this constant buffer when we get to the shader side of things
      In the example I'm following I see they have this as their vertex shader, but I don't understand how the shader knows to use the MatrixBuffer cbuffer. They just use the members directly. What if there was multiple cbuffer declarations like the Microsoft documentation says you could have?
      //Inside vertex shader cbuffer MatrixBuffer { matrix worldMatrix; matrix viewMatrix; matrix projectionMatrix; }; struct VertexInputType { float4 position : POSITION; float4 color : COLOR; }; struct PixelInputType { float4 position : SV_POSITION; float4 color : COLOR; }; PixelInputType ColorVertexShader(VertexInputType input) { PixelInputType output; // Change the position vector to be 4 units for proper matrix calculations. input.position.w = 1.0f; // Calculate the position of the vertex against the world, view, and projection matrices. output.position = mul(input.position, worldMatrix); output.position = mul(output.position, viewMatrix); output.position = mul(output.position, projectionMatrix); // Store the input color for the pixel shader to use. output.color = input.color; return output; }  
    • By gomidas
      I am trying to add normal map to my project I have an example of a cube: 
      I have normal in my shader I think. Then I set shader resource view for texture (NOT BUMP)
                  device.ImmediateContext.PixelShader.SetShaderResource(0, textureView);             device.ImmediateContext.Draw(VerticesCount,0); What should I do to set my normal map or how it is done in dx11 generally example c++?
  • Popular Now