Re: [Algorithms] Filtering
Brought to you by:
vexxed72
From: Tibor K. <tib...@gm...> - 2010-10-01 20:42:26
|
Just wanted to point something out - now that you know it won't work it probably makes sense to switch to a float32 texture and still do the filtering manually... you'll at least save the pack/unpack instructions :) - Tibor On 10/1/2010 9:51 PM, Andreas Brinck wrote: > Hi Ola, > > unfortunately the floating point textures on the platform I'm working > on don't support bilinear filtering (this is the reason why I stored > the value in an RGB-texture to begin with). > > /Andreas > > P.S. Got your Ph.D yet? > > On Fri, Oct 1, 2010 at 8:12 PM, Ola Olsson<ola...@gm...> wrote: >> While we're throwing ideas around, why not try using a float texture and see >> if it produces the same error? >> >> .ola >> >> P.S. >> Hi Andreas :) >> >> ----- Original Message ----- >> From: "Nathaniel Hoffman"<na...@io...> >> To: "Game Development Algorithms"<gda...@li...> >> Sent: Friday, October 01, 2010 7:59 PM >> Subject: Re: [Algorithms] Filtering >> >> >>> Didn't the newer NVIDIA GPUs fix this? >>> >>>> You guessed right. The loss of precision is in the texture units. >>>> Unfortunately, 8 bit components are filtered to 8 bit results (even >>>> though >>>> they show up as floating point values in the shader). This is true for >>>> nvidia gpus for sure and probably all other gpus. >>>> >>>> -mike >>>> ----- Original Message ----- >>>> From: Stefan Sandberg >>>> To: Game Development Algorithms >>>> Sent: Friday, October 01, 2010 1:45 AM >>>> Subject: Re: [Algorithms] Filtering >>>> >>>> >>>> Assuming you're after precision, what's wrong with doing it manually? >>>> :) >>>> If performance is what you're after, and you're working on textures as >>>> they were intended(ie, game textures or video or something like that, >>>> not 'data'), you could separate contrast& color separately, keeping >>>> high contrast resolution, and downsampled color, and >>>> you'd save both bandwidth and instr. >>>> If you simply want to know 'why', I'm guessing loss of precision in the >>>> tex units? >>>> You've already ruled out shader precision from your own manual >>>> filtering, so doesn't leave much else, imo.. >>>> Other than manipulating the data you're working on, which is the only >>>> thing you -can- change I guess, I cant really see a solution, >>>> but far greater minds linger here than mine, so hold on for what I >>>> assume will be a lengthy description of floating point math as >>>> it is implemented in modern gpu's :) >>>> >>>> >>>> >>>> >>>> >>>> >>>> On Fri, Oct 1, 2010 at 9:57 AM, Andreas Brinck >>>> <and...@gm...> wrote: >>>> >>>> Hi, >>>> >>>> I have a texture in which I use the R, G and B channel to store a >>>> value in the [0, 1] range with very high precision. The value is >>>> extracted like this in the (Cg) shader: >>>> >>>> float >>>> extractValue(float2 pos) { >>>> float4 temp = tex2D(buffer, pos); >>>> return (temp.x * 16711680.0 + temp.y * 65280.0 + temp.z * 255.0) * >>>> (1.0 / 16777215.0); >>>> } >>>> >>>> I now want to sample this value with bilinear filtering but when I do >>>> this I don't get a correct result. If I do the filtering manually >>>> like >>>> this: >>>> >>>> float >>>> sampleValue(float2 pos) { >>>> float2 ipos = floor(pos); >>>> float2 fracs = pos - ipos; >>>> float d0 = extractValue(ipos); >>>> float d1 = extractValue(ipos + float2(1, 0)); >>>> float d2 = extractValue(ipos + float2(0, 1)); >>>> float d3 = extractValue(ipos + float2(1, 1)); >>>> return lerp(lerp(d0, d1, fracs.x), lerp(d2, d3, fracs.x), >>>> fracs.y); >>>> } >>>> >>>> everything works as expected. The values in the buffer can be seen as >>>> a linear combination of three constants: >>>> >>>> value = (C0 * r + C1 * g + C2 * b) >>>> >>>> If we use the built in texture filtering we should get the following >>>> if we sample somewhere between two texels: {r0, g0, b0} and {r1, g1, >>>> b1}. For simplicity we just look at filtering along one axis: >>>> >>>> filtered value = lerp(r0, r1, t) * C0 + lerp(g0, g1, t) * C1 + >>>> lerp(b0, b1, t) * C2; >>>> >>>> Doing the filtering manually: >>>> >>>> filtered value = lerp(r0 * C0 + b0 * C1 + g0 * C2, r1 * C0 + g1 * C1 >>>> + >>>> b1 * C2, t) = >>>> = (r0 * C0 + b0 * C1 + g0 * C2) * (1 - t) + (r1 * >>>> C0 + g1 * C1 + b1 * C2) * t = >>>> = (r0 * C0) * (1 - t) + (r1 * C0) * t + ... = >>>> = lerp(r0, r1, t) * C0 + ... >>>> >>>> So in the world of non floating point numbers these two should be >>>> equivalent right? >>>> >>>> My theory is that the error is caused by an unfortunate order of >>>> floating point operations. I've tried variations like: >>>> >>>> (temp.x * (16711680.0 / 16777215.0) + temp.y * (65280.0/16777215.0) + >>>> temp.z * (255.0/16777215.0)) >>>> >>>> and >>>> >>>> (((temp.x * 256.0 + temp.y) * 256.0 + temp.z) * 255.0) * (1.0 / >>>> 16777215.0) >>>> >>>> but all exhibit the same problem. What do you think; is it possible >>>> to >>>> solve this problem? >>>> >>>> Regards Andreas >>>> >>>> ------------------------------------------------------------------------------ >>>> Start uncovering the many advantages of virtual appliances >>>> and start using them to simplify application deployment and >>>> accelerate your shift to cloud computing. >>>> http://p.sf.net/sfu/novell-sfdev2dev >>>> _______________________________________________ >>>> GDAlgorithms-list mailing list >>>> GDA...@li... >>>> https://lists.sourceforge.net/lists/listinfo/gdalgorithms-list >>>> Archives: >>>> >>>> http://sourceforge.net/mailarchive/forum.php?forum_name=gdalgorithms-list >>>> >>>> >>>> >>>> >>>> >>>> ------------------------------------------------------------------------------ >>>> >>>> >>>> ------------------------------------------------------------------------------ >>>> Start uncovering the many advantages of virtual appliances >>>> and start using them to simplify application deployment and >>>> accelerate your shift to cloud computing. >>>> http://p.sf.net/sfu/novell-sfdev2dev >>>> >>>> >>>> ------------------------------------------------------------------------------ >>>> >>>> >>>> _______________________________________________ >>>> GDAlgorithms-list mailing list >>>> GDA...@li... >>>> https://lists.sourceforge.net/lists/listinfo/gdalgorithms-list >>>> Archives: >>>> >>>> http://sourceforge.net/mailarchive/forum.php?forum_name=gdalgorithms-list------------------------------------------------------------------------------ >>>> Start uncovering the many advantages of virtual appliances >>>> and start using them to simplify application deployment and >>>> accelerate your shift to cloud computing. >>>> http://p.sf.net/sfu/novell-sfdev2dev_______________________________________________ >>>> GDAlgorithms-list mailing list >>>> GDA...@li... >>>> https://lists.sourceforge.net/lists/listinfo/gdalgorithms-list >>>> Archives: >>>> http://sourceforge.net/mailarchive/forum.php?forum_name=gdalgorithms-list >>> >>> >>> ------------------------------------------------------------------------------ >>> Start uncovering the many advantages of virtual appliances >>> and start using them to simplify application deployment and >>> accelerate your shift to cloud computing. >>> http://p.sf.net/sfu/novell-sfdev2dev >>> _______________________________________________ >>> GDAlgorithms-list mailing list >>> GDA...@li... >>> https://lists.sourceforge.net/lists/listinfo/gdalgorithms-list >>> Archives: >>> http://sourceforge.net/mailarchive/forum.php?forum_name=gdalgorithms-list >> >> ------------------------------------------------------------------------------ >> Start uncovering the many advantages of virtual appliances >> and start using them to simplify application deployment and >> accelerate your shift to cloud computing. >> http://p.sf.net/sfu/novell-sfdev2dev >> _______________________________________________ >> GDAlgorithms-list mailing list >> GDA...@li... >> https://lists.sourceforge.net/lists/listinfo/gdalgorithms-list >> Archives: >> http://sourceforge.net/mailarchive/forum.php?forum_name=gdalgorithms-list >> > ------------------------------------------------------------------------------ > Start uncovering the many advantages of virtual appliances > and start using them to simplify application deployment and > accelerate your shift to cloud computing. > http://p.sf.net/sfu/novell-sfdev2dev > _______________________________________________ > GDAlgorithms-list mailing list > GDA...@li... > https://lists.sourceforge.net/lists/listinfo/gdalgorithms-list > Archives: > http://sourceforge.net/mailarchive/forum.php?forum_name=gdalgorithms-list > |