Fringes around textures

Started by
3 comments, last by Shenjoku 10 years, 11 months ago

I'm getting some strange fringes around some textures at specific sizes that I cannot figure out how to get rid of. I'm rendering the primitives to an off-screen surface then rendering the result of that texture on another primitive on the screen. The off-screen rendering supports MSAA but with or without it the problem persists. It doesn't seem to affect all textures either. If the texture is larger than 512 in either dimension then it doesn't have the problem.

You can see the fringes around the outside of the two textures in this screenshot. One is a solid white 311x100 JPEG and the other is a 152x95 PNG. The image format doesn't seem to matter, just the size. Whether or not the image has an alpha channel doesn't affect it either.

[attachment=15272:RenderingError.png]

I've tried debugging the problem in PIX and noticed that there is a bunch of garbage data around the textures, but even if I zero out the texture memory it doesn't get rid of it for some of them so I'm not sure what's going on there. You can see in the screenshot below that there's a bunch of white where there should be nothing but empty space to the right of the texture since it's only using 311x100 of the available space.

[attachment=15274:PixTextureData.png]

P.S. This is all with DirectX 9 btw.

Advertisement

Are you sure AddressU and AddressV in D3D11_SAMPLER_DESC for your sampler are set to D3D11_TEXTURE_ADDRESS_CLAMP? I had a border issue with a skybox but when I set it to clamp the border went away.

Linear filtering means that, for the border pixels, it's probably taking a sample from just outside the edge of the texture. I think when you create your texture, you need to "continue" the border into the "empty" areas of the texture. Or else, when you're drawing your texture, push your texture coordinates just inside the valid part of the texture (of course, then when you draw at smaller sizes, the artifact may creep in again).

(why are you using a 311x100 solid white texture? A 1x1 white texture would serve just as well).

Linear filtering means that, for the border pixels, it's probably taking a sample from just outside the edge of the texture. I think when you create your texture, you need to "continue" the border into the "empty" areas of the texture. Or else, when you're drawing your texture, push your texture coordinates just inside the valid part of the texture (of course, then when you draw at smaller sizes, the artifact may creep in again).

Interesting. I didn't know that. I'll give that a shot and see what happens.

(why are you using a 311x100 solid white texture? A 1x1 white texture would serve just as well).

I know. It's just a test texture that copies the size of another image that the bug was reported with.

Are you sure AddressU and AddressV in D3D11_SAMPLER_DESC for your sampler are set to D3D11_TEXTURE_ADDRESS_CLAMP? I had a border issue with a skybox but when I set it to clamp the border went away.

I'm using DirectX 9. I guess I should have put that in the original post. I'll update it now. Thanks for the tip though. The default for texture addressing mode is wrap so we were wrapping. Changing it to clamp fixed part of the problem.

Well that seems to have done it! I changed the texture address mode to clamp, since wrap is the default, and added code to copy the last row/column as suggested and the problem is gone. Thanks a lot for the help. This was a very annoying bug.

This topic is closed to new replies.

Advertisement