Jump to content
  • Advertisement
Sign in to follow this  
myvraccount

Texture Rendering

This topic is 905 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

In SharpDX/SlimDX, I need to be able to render my image onto a Texture2D object rather than to the screen, then convert the texture into a Bitmap object.

 

If someone could PLEASE tell me how to do this, that would be great (with source code is even better), because I feel like I've tried everything!  Here's what I've done so far, and what's going wrong:

 

I've set it up to render as normal, and then I've tried calling each of the following:

- RenderTargetView.ResourceAs<Texture2D>

- Texture2D.FromSwapChain<Texture2D>

 

Each of these successfully returns a Texture2D object, so I'm not sure if it even matters which one I use as long as I can get one to work.

 

However, then I call the constructor for ShaderResourceView, with the Texture2D as a parameter, and a device (which I verified works correctly), and I get an error that says there's an incorrect parameter (DIERR_INVALIDPARAM) but it doesn't say what parameter is incorrect or in what way.

 

I compared the description of the Texture2D returned from either of the above functions to one that I manually create when making a Texture2D from a Bitmap (which works correctly).  Both functions create an identical TextureDescription, but the BindFlags are different from the one I manually create.  The one I manually make I set to ShaderResource, but the one that's returned from either of the above functions sets it to RenderTarget.

 

Is this likely to be causing the problem, and if so, how can it be fixed?  If not, what is likely the problem?

 

I have tried changing the BindFlags after the texture is returned to me, but the variable is read only!

 

What should I do?  Thank you.

Share this post


Link to post
Share on other sites
Advertisement

Please, does anyone know how to do this?  Even if you could just tell me how to make the RenderTargetView to be a Texture2D or something like that, instead of the screen/backbuffer, and so that it outputs a Texture2D that I could then just draw like any other Texture2D (I guess it probably would need the BindFlags set to ShaderResource instead of RenderTarget, but I may be wrong).

Share this post


Link to post
Share on other sites

It's not either, it's both. These are flags, so certain combinations are valid and RenderTarget combined with ShaderResource is a quite common one.

 

For readback you need an additional resource with usage staging (and cpu read), only these can be actually mapped and read back. After your rendering use context.CopyResource from your render target texture to the staging texture. Then you can map.

Share this post


Link to post
Share on other sites

But the problem with the flags is it won't let me set them, only read them.

 

For the next thing you said, I'll try it, but what do you mean by a "staging" texture?  When you say "usage staging" do you mean I set usage flags to = staging or something like that?  I'm not sure I tried CopyResource but I'll look into it.

 

Also, is there a more efficient way to just skip the target texture or backbuffer or swap chain or whatever it's using to put it on the screen and just tell it right off the bat to ignore the screen and use a Texture2D as the output instead?  It seems like this would be quicker to process and a bit less messy.

 

In any case, I can generally only work on it during weekends, so I'll have to see how it goes then.

Share this post


Link to post
Share on other sites
Flags and other properties can only be set at creation of resources/textures. Similar applies to views. That's how the API works: You decide what you need and create (usually) everything at app start.
 

When you say "usage staging" do you mean I set usage flags to = staging or something like that?


Yes, though in this case it's an enum, you can't combine them. This is why you need this copy operation: you can't read back a usage=default resource directly. Again, this is how the API/driver/hardware works, one has to get used to it.
 

Also, is there a more efficient way to just skip the target texture or backbuffer or swap chain or whatever it's using to put it on the screen and just tell it right off the bat to ignore the screen and use a Texture2D as the output instead? It seems like this would be quicker to process and a bit less messy.


Bacterius answered this already - correctly. You don't need a swap chain, this is only if you want to render to a window. You create a Texture2D and a RendertTargetView thereof and you're ready to go.

I get the impression you're quite confused about all of this. I recommend going through the rastertek tutorial (there are even SharpDX transliterations around IIRC) and/or buy F.Luna's book. Though the latter is C++ I consider it the best book for D3D11 beginners.

Share this post


Link to post
Share on other sites

That looks like a GREAT set of tutorials (although they're in C++ and I'm using C#, but oh well), so I'll look into them more as soon as I get a chance.  Thanks.

Share this post


Link to post
Share on other sites
You should learn how to find stuff yourself wink.png. I mentioned the transliteration for SharpDX. That was a first google hit:

SharpDX for Rastertek tutorials

Also, the DirectX subforum here has a couple of links that should help you.

Edit: Also, gamedev.net member Eric Richards has transliterated Luna's source code (also available online) to SlimDX here

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!