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.
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.