DGL
https://delphigl.com/forum/

texelFetch im Vertex-Shader
https://delphigl.com/forum/viewtopic.php?f=20&t=9862
Seite 1 von 1

Autor:  Schläfer [ Sa Apr 16, 2011 20:55 ]
Betreff des Beitrags:  texelFetch im Vertex-Shader

Hallo,

ich habe mal wieder notgedrungen eine ATI-Karte in meinem PC, was mir zumindest die Möglichkeit gibt meine Programme auch für diese Karten kompatibel zu machen. Viele Probleme die auftreten sind selbst verschuldet und kann ich auch beheben, manche scheinen sich jedoch jeder Logik zu entziehen und ich komm' nicht weiter.
Ich hatte eine kleine Simulation für das Verhalten von Gas geschrieben, die auch wunderbar auf meiner NVidia-Grafikkarte lief. Auf der Radeon HD 4670 die ich momentan eingebaut habe, gibt es allerdings ein Problem.

Der problematische Shader sieht so aus:
Code:
  1. #extension GL_EXT_gpu_shader4: enable
  2.  
  3. uniform sampler3D Velocity;
  4.  
  5. void main(void)
  6. {
  7.   ivec3 size = textureSize3D(Velocity, 0).xyz;
  8.    
  9.   //texture3D(Velocity,vec3(0.0));
  10.   gl_FrontColor = vec4(1.0);
  11.  
  12.   gl_Position = gl_ModelViewProjectionMatrix * vec4(vec3(gl_Vertex)+gl_Vertex[3]*5.0*texelFetch3D(Velocity,ivec3(gl_Vertex),0).xyz,1.0);
  13. }

Der Fragment-Shader ist trivial.

Eigentlich ist der Shader nichts besonderes und hat auch nichts mit der eigentlichen Simulation zu tun, sondern soll lediglich die Strömungsgeschwindigkeiten mit Linien darstellen. Die 4te Vertex-Komponente ist übrigends entweder 0 oder 1 und ich verwende sie um festzustellen ob der Vertex der Anfang oder das Ende der Linie ist.

Das Ergebnis ist aber das garnichts zu sehen ist, was daran liegt das texelFetch3D nur Nullen zurückliefert.
Wenn ich allerdings die auskommentierte Zeile hinzunehme, funktioniert es, obwohl diese eigentlich sinnlos ist, da das Ergebnis des Texture-Lookups nirgends gespeichert wird.
Ich finde dieses Verhalten außerst merkwürdig und obwohl ich es umschiffen könnte indem ich texture3D statt texelFetch3D verwende, würde ich gerne wissen wieso es so nicht funktioniert.

Autor:  sharkman [ So Apr 17, 2011 09:05 ]
Betreff des Beitrags:  Re: texelFetch im Vertex-Shader

hatte dasselbe Problem auch mal, ließ sich auch nicht anders lösen. Ich vermute mal, dass texelFetch nur in den L1 - cache schaut oder so ähnlich.

Autor:  Coolcat [ So Apr 17, 2011 09:12 ]
Betreff des Beitrags:  Re: texelFetch im Vertex-Shader

Versuchs mal mit
Code:
  1. #extension GL_EXT_gpu_shader4: require

Bei enable wird die Erweiterung nur dann aktiviert, wenn sie verfügbar ist. Bei require wird beim fehlen der Extension ein Fehler ausgelöst.
Das enable Token nutzt man vermutlich nur bei Shadern die dann mittels Präprozessor-Kommandos (z.B. #if defined(...)) entscheidet welche Implementierung genutzt wird. Ich vermute man kann die Extensionnamen einfach als Identifier für den defined-Operator nutzen. Probiert habe ich das bisher aber noch nicht.

Unabhängig von deinem Problem würde ich die letzte Zeile so schreiben. Sollte äquivalent sein, aber besser lesbar:
Code:
  1. vec3 position = gl_Vertex.xyz;
  2. if (gl_Vertex.w > 0.5) {
  3.     position += 5.0 * texelFetch3D(Velocity,ivec3(gl_Vertex),0).xyz;
  4. }
  5. gl_Position = gl_ModelViewProjectionMatrix * vec4(position,1.0);

Des weiteren wird das texelFetch3D nur dann ausgewertet, wenn es benötigt wird.

Autor:  Schläfer [ Mi Apr 20, 2011 16:49 ]
Betreff des Beitrags:  Re: texelFetch im Vertex-Shader

Coolcat hat geschrieben:
Versuchs mal mit
Code:
  1. #extension GL_EXT_gpu_shader4: require

Bei enable wird die Erweiterung nur dann aktiviert, wenn sie verfügbar ist. Bei require wird beim fehlen der Extension ein Fehler ausgelöst.

Geholfen hat das leider nicht, aber es ist schonmal gut zu wissen, dass es da einen Unterschied gibt. Ich hab' das "enable" immer verwendet, weil der Errorlog bei meiner NVidia-Karte das als Lösung angegeben hat, wenn man es mal vergessen hatte.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/