Re: [Algorithms] Filtering
Brought to you by:
vexxed72
|
From: Nathaniel H. <na...@io...> - 2010-10-01 18:32:23
|
My impression was that the DX9-generation NVIDIA ones did 8-bit precision
filtering on any 8-bit textures or DXT, and even the DX10 ones (GeForce
9XXX etc.) did higher precision. Being stuck in the console time warp, I
don't have much hands-on experience with GPU hardware newer than 2006 or
so, so I may be wrong.
> I'm thinking maybe older gpu's did even courser filtering than this -
> 6-bit
> or something instead of 8. Maybe this was the recent improvement?
>
> On Fri, Oct 1, 2010 at 12:59 PM, Nathaniel Hoffman <na...@io...> wrote:
>
>> 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
>>
>
>
>
> --
> Jeff Russell
> Engineer, 8monkey Labs
> www.8monkeylabs.com
> ------------------------------------------------------------------------------
> 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
|