FXAA and Color Space

Started by
8 comments, last by jerrinx 11 years, 8 months ago
Hey guys,

I know, there were a few topics on FXAA, but it didn't help me with my problem, hence the new thread.

The problem is, I don't see any difference between the FXAA and Non-FXAA Render.

Then again I am not passing a non-linear color space texture to the FXAA shader. And not sure how to.
If my understanding is correct Linear color space is the one that is got when you sample a texture (0 to 1 range or 0 - 255 range) where the colors change in a linear fashion.

I am not sure what sRGB is about ?
Currently my texture is in RGBA8 dx format.

According to Fxaa3.11 release by Timothy.
"Applying FXAA to a framebuffer with linear RGB color will look worse.
This is very counter intuitive, but happens to be true in this case.
The reason is because dithering artifacts will be more visiable
in a linear colorspace."

.

The FXAA paper mentions something about using the following in DX9 (which is what i am working on)
// sRGB->linear conversion when fetching from TEX SetSamplerState(sampler, D3DSAMP_SRGBTEXTURE, 1);
// on SetSamplerState(sampler, D3DSAMP_SRGBTEXTURE, 0); // off
// linear->sRGB conversion when writing to ROP SetRenderState(D3DRS_SRGBWRITEENABLE, 1);
// on SetRenderState(D3DRS_SRGBWRITEENABLE, 0); // off


This is what I am doing.
1. Render to texture using D3DRS_SRGBWRITEENABLE = 1, and turn it off after I am done.
When I render this texture, it looks brighter than usual.
2. Render screen quad with this texture using D3DSAMP_SRGBTEXTURE = 1, and turn it off after I am done.
When this texture renders, it looks correct.

But the aliasing still remains. I figured I shouldn't be doing step two because that would turn the non-linear color to linear while sampling.
But doing that results in the texture/scene got from the first step.

I have attached my shaders here.
Any help is greatly appreciated.

P.S, Timothy also mentioned something about pixel offset being different on dx11 w.r.t dx9 by 0.5 of a pixel.
http://timothylottes.blogspot.com/2011/07/fxaa-311-released.html

Thanks a lot !
Jerry

[attachment=10322:FXAA.zip]
JerrinX
Advertisement

The problem is, I don't see any difference between the FXAA and Non-FXAA Render.

Could you post some comparison screenshots ?
Oh I forgot, about the pics.

I have an abstraction going on for directx9 and opengl2.
So the same window in the pics support both of them.

I got hold of a glsl shader for FXAA and integrated to the opengl side.
(am not sure what version it is, but it appears to be from the same source)

Seems to work. But when I made changes to the directx hlsl with updated inputs, it still doesn't work sad.png

I am reattaching all the shaders and the screenshots here.

Note the difference w.r.t the directx screenshots only. The window name holds the name of the renderer
When I use GLSL it works fine.

Thanks
Jerry
JerrinX
The major difference between DX9 and OGL2 is, that DX9 is, well, DX9, but OGL2 can be pimped by using extensions. The FXAA shaders use a lot of extensions, I would test it on a higher DX version, maybe the FXAA implemenation has reached its limits on DX9, or you should choose a preset better suited for DX9.
Cool thanks man.

Btw saw your game. It looks damn awesome
JerrinX
The problem with DX9 is that it has the "half pixel offset problem", which will wreak havoc with any kind of post-processing shader.

The official description of the problem is here:
http://msdn.microsof...0(v=vs.85).aspx

In the versions of FXAA that I've used, it expects you to account for this flaw in DX9 yourself and EITHER shift your full-screen vertices OR texture coordinates by half a pixel as described in the MSDN link, so that the pixel shader receives the same interpolated values as it would in GL/DX10/DX11.
If you want to understand the linear color space, try to google "gamma correction". Generally speaking, to the monitor, the relationship between luminance and color is not linear, but a Exponential curve. So in order to output the linear color, texture color was also been precorrected by an exponent value. So although you can see the correct color on the screen,the color you used before is nonlinear. This can cause problems in some algrithm,but in my work,the FXAA use nonlinear color space works well.
Hey Thanks guys.

Like Hodgman said, My initial setting was 1/2 texel size off on DX9.
After fixing the issue the textures still renders the old jaggy pattern sad.png

Initially I noticed some difference in the image when rendering to texture vs normal rendering in the case of DX9.
Now, both look the same. I am assuming the 1/2 texel problem is accounted for.

@dragon.R
I used this article to understand the color space stuff
http://filmicgames.com/archives/299

Tried to use the color space as in the Fxaa_3.11 header. But still no dice.

Reattaching updated shaders.

lol... Maybe I should go for SMAA smile.png
https://vimeo.com/31247769
Fxaa3 (lower quality 0.62 ms) vs SMAA Tx2 (higher quality 1.32 ms)
Hard to decide

Thanks guys
Jerry
JerrinX
I`ve read your code,you need to #define FXAA_GREEN_AS_LUMA 1,otherwise it will take the alpha of tex color as luminance,as your input alpha is always 1,nothing will be changed. And your parameters seemed to have some problems,try to read the annotation and check them.
Managed to port glsl code to hlsl for FXAA.
Seems to work.

Attaching it for people who need it. It looks simpler than the Fxaa 3.11. I am guessing its the old version. But it performs better.
Tried with and without Luma. Works in both cases.

On DX9 you need to do color space conversion, in order to use it correctly.

I do something like this:

Stage 0
Render Main Scene to texture
- Texture Read convert - SRGB to Linear
- Texture Write convert - None

Stage 0.5 (Optional, if filling alpha with luma)
Render Texture to Texture
- Texture Read convert - None
- Texture Write convert - None

Stage 1
Render Texture to Monitor using FXAA
- Texture Read convert - None
- Texture Write convert - Linear to SRGB (as Monitor requires SRGB format)

Hopefully that clarifies some stuff.

For now this works.

@Dragon. Couldn't get the Fxaa 3.11 to work though. I rechecked all the variables, I am not sure whats the problem. if you find something wrong, please tell me. Attaching the updated old one again. Attaching some part of the code, if someone wants to see.

I have a question
FPS drops as follows (@1080p):
- Normal Render (1500 FPS)
- Render To Texture (1000 FPS)
- Texture To Scene with FXAA (500 FPS)
Is that normal ?

Jerry
JerrinX

This topic is closed to new replies.

Advertisement