PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit OpenGL & Depth-Texture


Asmodeus
2005-12-01, 12:53:00
Ich habe irgendwo einen Fehler oder Denkfehler und komme nicht drauf, wo der Fehler liegt. Es besteht folgendes Problem: Zu Testzwecken habe ich eine 2x2 Pixel große Depth-Texture im Format GL_FLOAT. In diese Textur schreibe ich für alle 4 Pixel den Wert 0.1001f. Im Fragmentshader lese ich den Wert der Textur aus und lasse ihn mir als Grauwert anzeigen, einmal unverändert und einmal mit 3.0f multipliziert. Dabei erhalte ich nun folgende Ergebnisse:

Texturfiltermethode: GL_NEAREST; Ergebnisse: 26 / 77
Texturfiltermethode: GL_LINEAR; Ergebnisse: 25 / 75

Wie sind diese abweichenden Ergebnisse zu erklären, meiner Meinung nach müssten sie doch gleich sein, oder habe ich irgendwo nen Denkfehler und übersehe etwas Simples?

Gruss, Carsten.

Demirug
2005-12-01, 13:17:07
Rundungsungenauigkeiten im Filterblock würde ich mal tippen.

Willst du Softshadows machen? Dann würde ich von dem linearen Filter sowieso die Finger lassen.

zeckensack
2005-12-01, 13:27:09
Es besteht folgendes Problem: Zu Testzwecken habe ich eine 2x2 Pixel große Depth-Texture im Format GL_FLOAT.Wie hast du das denn hinbekommen?
internal_format muss GL_DEPTH_COMPONENT{|16|24} sein, sonst hast du keine depth texture.
Floating point-Geschmacksrichtungen gibt es nicht, wenn ich nicht irgendeine sehr neumodische Extension verpasst haben sollte ...

Asmodeus
2005-12-01, 13:33:35
Rundungsungenauigkeiten im Filterblock würde ich mal tippen.

Willst du Softshadows machen? Dann würde ich von dem linearen Filter sowieso die Finger lassen.

Die Vermutung hatte ich auch schon, dass da nur beim Filtern etwas falsch laufen kann. Wäre es möglich, dass beim Filtern von Depth-Textures irgendwo bewusst etwas eingespart wird? Denn wenn man sehr spekulativ wäre, dann könnte man auch sagen, die Werte 25 und 75 erhält man auch, wenn man mit normalen 8 Bit Farbwerten rechnet, dafür braucht es keine 32 Bit Float-Werte.

Gruss, Carsten.

Asmodeus
2005-12-01, 13:35:46
Wie hast du das denn hinbekommen?
internal_format muss GL_DEPTH_COMPONENT{|16|24} sein, sonst hast du keine depth texture.
Floating point-Geschmacksrichtungen gibt es nicht, wenn ich nicht irgendeine sehr neumodische Extension verpasst haben sollte ...

Ja, GL_DEPTH_COMPONENT habe ich natürlich verwendet.


...
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT,w,h,0,GL_DEPTH_COMPONENT,GL_FLOA T,ShadowPixels);
...


Und im Fragment-Shader dann zu Testzwecken einfach:


uniform sampler2DShadow Texture2;
...
varying vec4 ObjectTexCoordShadow;
...
float ResultShadow = 1.0;

vec4 Texture2Color = shadow2D(Texture2,ObjectTexCoordShadow.xyz);

if(ObjectTexCoordShadow.z > Texture2Color.z)
ResultShadow = Texture2Color.z * 3.0;

gl_FragColor.rgb = ResultShadow.xxx;
...


Gruss, Carsten.

zeckensack
2005-12-01, 13:46:45
Ah ok, jetzt habe ich's endlich begriffen =)
"Präzise" wären 25,5225/76,5675.
Bei GL_LINEAR gehen dir nun irgendwo >=0,0225 verloren, sodass dann abgerundet wird, statt aufgerundet.

Die Umwandlung in das Texturformat dürfte in deinem Fall relativ verlustarm sein. 6560,0535/65535 -> 6560/65535 für eine 16 Bit-Textur, und noch weniger Fehler bei einer 24 Bit-Textur.

Asmodeus
2005-12-01, 13:53:46
Ah ok, jetzt habe ich's endlich begriffen =)
"Präzise" wären 25,5225/76,5675.
Bei GL_LINEAR gehen dir nun irgendwo >=0,0225 verloren, sodass dann abgerundet wird, statt aufgerundet.

Die Umwandlung in das Texturformat dürfte in deinem Fall relativ verlustarm sein. 6560,0535/65535 -> 6560/65535 für eine 16 Bit-Textur, und noch weniger Fehler bei einer 24 Bit-Textur.

Ja, wobei nun die Frage ist, ob es "normal" ist, dass die 0,0225 verloren gehen?

Gruss, Carsten.

Asmodeus
2005-12-06, 13:07:26
Gibt es für diese "Merkwürdigkeit" von keinem eine plausible Erklärung? Ich stehe monentan wohl auch etwas auf dem Schlauch und finde keinen Grund für diese Abweichungen.

Gruss, Carsten.

zeckensack
2005-12-06, 15:57:39
Nö. Von der Mathematik her sollte der lineare Filter, wenn man ihn viermal mit dem gleichen Wert füttert, das Ergebnis nicht verändern.
Das könnte ein Bug in der Hardware sein. Evtl einfach mal zu NVIDIA rüberschicken.

Asmodeus
2006-01-20, 12:50:48
Ich bin im Zusammenhang mit dem Problem etwas ins Grübeln gekommen. Der Depthbuffer ist intern ja nicht in einem Floatingpoint-Format abgelegt, sondern über ganzzahlige 16|24|32 Bit Werte, oder verwechsel ich da gerade etwas? Wenn dem so ist, dann ist mir immerhin prinzipiell klar(aber noch nicht in diesem speziellen Beispielfall), wie es zu solchen ungewollten Abstufungen der Grauwerte kommen kann. Meine Frage ist nun, ob und wann es vorgesehen ist, auf Grafikkarten echte FP-Depthbuffer einzuführen?

Gruss, Carsten.

Coda
2006-01-20, 14:04:07
Du kannst den Tiefenwert ja in durchaus in eine FP-Textur rendern über nen Pixelshader.