Storing non-color data in texture from pixel shader
#1 Members - Reputation: 154
Posted 12 November 2012 - 05:02 PM
[source lang="cpp"]return float4(floatValue, asfloat(firstUintValue), asfloat(secondUintValue), asfloat(thirdUintValue));[/source]
I do this because I don't want to cast the uint values to float, but rather maintain their binary equivalent.
However, when I read from the texture using my compute shader and convert these values back to uint using the asuint(texel.Y) function, they do not seem to be the same value I attempted to store in the first place. Actually, most the time I seem to get ZERO values out of this.
I know that I have supplied my compute shader with the texture as a shader resource properly, because I am able to retrieve the X component of the texels, which you'll notice above was a regular float (between 0.0 and 1.0).
Does the pixel shader require output to be 0.0 - 1.0 floats and do automatic adjustments otherwise?
Thanks you for your time and assistance.
#2 Moderators - Reputation: 5436
Posted 12 November 2012 - 05:47 PM
The easiest thing for you to do would be to just use two render targets: one that has a single FLOAT or UNORM channel for your floating-point value, and another that uses a UINT format so that you can just store your values as float's and uint's with no conversions necessary.
#3 GDNet+ - Reputation: 2372
Posted 12 November 2012 - 07:46 PM
Check out our (now available) D3D11 book: Practical Rendering and Computation with Direct3D 11
Check out my Direct3D 11 engine on CodePlex: Hieroglyph 3
Check out our free online D3D10 book: Programming Vertex, Geometry, and Pixel Shaders
Lunar Rift :: Dual-Paraboloid Mapping Article :: Parallax Occlusion Mapping Article :: Fast Silhouettes Article
#4 Members - Reputation: 154
Posted 14 November 2012 - 10:01 AM
In your case anything except for a 32-bit FLOAT format will mess up your values, because conversions will happen.
What kind of conversions? I just figured that since I was using the asfloat() function to store my UINT values, the texture would accept it as a float - how would the texture know the difference that it is actually a binary representation of a UINT? Unless the texture requires that the value be a value color-component value between 0.0 and 1.0.
Have you considered writing to a UAV in your pixel shader?
I'll have to think about this. The reason I'm doing it this way is because I actually am storing graphical data - I still take advantage of the way the pixel shader projects the data onto my texture using transformation matrices, and I also need it to take care of depth buffering and resolution. However, I don't care about color - instead I have other data to keep track of, which is why I was trying to use the color-component values to store other information.
#5 Moderators - Reputation: 5436
Posted 14 November 2012 - 01:04 PM
What kind of conversions?
The kind of conversions specified in the documentation for the DXGI_FORMAT enumeration.
I just figured that since I was using the asfloat() function to store my UINT values, the texture would accept it as a float - how would the texture know the difference that it is actually a binary representation of a UINT?
It won't know that it's a UINT, which can be a problem. The hardware will assume it's a 32-bit floating point value, and will treat it as such. If any format conversions are applied, it will apply floating point operations to your output value which will be totally invalid. For instance it might clamp to [0, 1] and convert to an unsigned integer, which will result in a bunch of garbage when you sample it an attempt to cast the value as an integer.
#7 Members - Reputation: 154
Posted 30 November 2012 - 03:13 PM






