PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bilinearer filter genauigkeit (war Speicherung FX12, und weitere Fragen (FP24, FP32))


Chris Lux
2003-12-15, 15:35:45
Original geschrieben von Demirug
Du kannst gar nicht im Fixed Format samplen. Das Ergebniss einer Textureoperation ist ein FP16 oder ein FP32 Wert.

Zudem kommt es ja auch noch darauf an in welchem Format die textur vorliegt. Beim 32Bit RGBA Format ist der Zahlenraum ja sowieso nur von 0 bis 1. Da kann man also durchaus auch mit FX12 noch eine Addition durchführen ohne das etwas passiert.

ich hab mal was getestet auf meiner geforceFX 5650go (dell inspiron)

als erstes habe ich normal eine textur zweimal gesampelt (einmal am aufpunkt, das zweite mal um eins nach rechts verschoben -> texture rectangle genau auf den viewport gemappt!). mit diesem beiden sampeln habe ich einen bilinearen filter nachgebiltet für eine gewichtete summe der beiden sample (code folgt unten).

als zweites habe ich die selbe textur an dem zwischenpunkt gesampelt.

beide ergebnisse wurden in einen 128bit framebuffer geschrieben und danach ausgelesen zum vergleichen. dabei kam folgendes heraus:

max fehler (differenz):
max = <0.00196081,0.00196081,0.00196081> maxlen = 0.00339623

(Testbild war nur ein 20x20 image mit der rechten hälfte schwarz und linken hälfte weiss)

CG-Code der programme (mit FP30 und VP30 profil compiliert):

Code program1 (nachgeahmter bilinfilter):

void bilinTestVP( in float4 position_in : POSITION,
in float2 texcoord_in : TEXCOORD0,

out float4 position_out : POSITION,

out float2 texcoord00_out : TEXCOORD0,
out float2 texcoord10_out : TEXCOORD1,
uniform float4x4 viewproj_mat)
{
position_out = mul(viewproj_mat, position_in);

texcoord00_out = texcoord_in + float2( 0, 0);
texcoord10_out = texcoord_in + float2( 1, 0);
}

float4 bilinTestFP( in float2 texcoord00_in : TEXCOORD0,
in float2 texcoord10_in : TEXCOORD1,

uniform samplerRECT tex_in : TEXUNIT0) : COLOR
{

float4 p00 = texRECT(tex_in, texcoord00_in);
float4 p10 = texRECT(tex_in, texcoord10_in);

return (p00 + p10)/2.0f;
}


Code program2 (ausnutzen des bilinfilters für gewichtete summe):

void bilinTestVP( in float4 position_in : POSITION,
in float2 texcoord_in : TEXCOORD0,

out float4 position_out : POSITION,

out float2 p01_out : TEXCOORD0,

uniform float4x4 viewproj_mat)
{
position_out = mul(viewproj_mat, position_in);

p01_out = texcoord_in + float2( 0.5f,0);
}

float4 bilinTestFP( in float2 tex01_in : TEXCOORD0,

uniform samplerRECT tex_in : TEXUNIT0) : COLOR
{
float4 p01 = texRECT(tex_in, tex01_in);

return p01;
}



meiner meinung nach zeigt dieses experiment (auch mit anderen gewichten probiert), dass der bilineare filter nur mit fx12 genauigkeit arbeitet (zumindest auf meiner abgespeckten fx). vielleicht könnte mal jemand diese programme auf einer vollwertigen fx testen und seine ergebnisse bekannt geben.

Demirug
2003-12-15, 15:40:45
Frage: Die Textur aus der du samplest liegt dabei im 32 Bit RGBA Format vor?

Chris Lux
2003-12-15, 15:43:07
Original geschrieben von Demirug
Frage: Die Textur aus der du samplest liegt dabei im 32 Bit RGBA Format vor?

RGB 8bit pro kanal. ich tests mal mit RGBA.

Demirug
2003-12-15, 15:46:25
Original geschrieben von Hans Ohlo
RGB 8bit pro kanal. ich tests mal mit RGBA.

Ob jetzt mit oder ohne Alpha ist egal. Es ging mir um die 8 Bit Pro Kanal.

Das die Sampeleinheit selbst nicht mit FP-Einheiten rechnet ist ja ein alter Hut. Das führt ja auch zu den aktuellen WHQL Problemen in Verbindnung mit FP-Texturen.

Chris Lux
2003-12-15, 15:55:04
Original geschrieben von Hans Ohlo
RGB 8bit pro kanal. ich tests mal mit RGBA.

ok habs getestet, aber mit dem selben ergebnis.

hier noch das testbild:
blackwhiteBLOCK_RGBA.tga (http://www.tu-ilmenau.de/~lux/blackwhiteBLOCK_RGBA.tga)

Chris Lux
2003-12-15, 15:57:09
Original geschrieben von Demirug
Ob jetzt mit oder ohne Alpha ist egal. Es ging mir um die 8 Bit Pro Kanal.

Das die Sampeleinheit selbst nicht mit FP-Einheiten rechnet ist ja ein alter Hut. Das führt ja auch zu den aktuellen WHQL Problemen in Verbindnung mit FP-Texturen.

alles klar, dass wollt ich hören (nich wirklich, da nun die genauigkeit meiner optimierten filter hin is ;)). war nur ein bisschen verwirrt wegen deinem ursprungsposting.

danke.

Demirug
2003-12-15, 16:59:50
Original geschrieben von Hans Ohlo
alles klar, dass wollt ich hören (nich wirklich, da nun die genauigkeit meiner optimierten filter hin is ;)). war nur ein bisschen verwirrt wegen deinem ursprungsposting.

danke.

Was ich mit meinem ursprünglichen Position sagen wollte war das man nur FP16 oder FP32 Temp-Register zur Verfügung hat. Deswegen ist das Ergebniss einer Texturoperation eben immer ein FP16 oder FP32 Wert. Die TMUs können Daten aber durchaus in einem anderen Format anliefern. Aus diesem Grund sitzt im Shaderbackend ein Formatkonverter der das was die TMUs anliefern entsprechend umrechnet. War schon beim NV2X so. Nur war da der Konverter Teil des Texturshader (bzw Pixelshader wie nV diesen Teil auch genannt hat obwohl es kein vollständiger PS nach DX8 ist),