Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jun 26, 2024 01:45

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: texelFetch im Vertex-Shader
BeitragVerfasst: Sa Apr 16, 2011 20:55 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: texelFetch im Vertex-Shader
BeitragVerfasst: So Apr 17, 2011 09:05 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: texelFetch im Vertex-Shader
BeitragVerfasst: So Apr 17, 2011 09:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: texelFetch im Vertex-Shader
BeitragVerfasst: Mi Apr 20, 2011 16:49 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.070s | 17 Queries | GZIP : On ]