PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vertex-/Pixelshader unter OpenGL


Nasenbaer
2002-11-25, 14:56:16
Hi,
ich habe ein Problem mit Pixel- und Vertexshaderprogrammen unter OpenGL. Ich weiß soviel, dass sie zurzeit nur mittels speziellen, herstellerspezifischen Extensions ansprechbar sind.
Nun habe ich mir vor einiger Zeit ein Sonderheft vom PC Magazin zu diesem Thema gekauft. Aber sämtliche Codebeispiele nutzen dafür nV-Extensions.
Ist es einfach dies Programme auf ATi umzuschreiben? Ich frage, weil ich mich gerade noch an OpenGL rantaste und deshalb noch nicht über die nötigen Kenntnisse verfüge. :)

Mfg Nasenbaer

firewars
2002-11-25, 15:15:42
Stichwort Vertex-/Pixelshader: Sollte jemand sonstige Tutorials haben, her damit ;)
Danke :D

zeckensack
2002-11-25, 15:55:28
ATI Pixel shader:
Die Spec (http://mirror.ati.com/developer/sdk/RadeonSDK/Html/Info/Extensions/ATI_fragment_shader.html) runterladen, da sind Code-Beispiele drin :naughty:

Wenn man sich ein klein wenig mit Quasi-Assembler zurechtfindet, ist das Interface sehr einfach, das Problem dabei ist eigentlich nur, daß die Spec anfangs recht schwer zu entwirren ist.

Interessant wird's da wo die Opcodes aufgelistet werden.

Es gibt sechs Funktionen für 'normale' Opcodes, je nach Anzahl der Operanden (1/2/3) und dann noch jeweils für Alpha und Farbe getrennt.

Aus
Register0=Register1*Register2+Register3
wird dann sowas (Vorsicht aus'm Kopf, muß nicht stimmen)
glColorFragmentOp3ATI(GL_MAD_ATI, //multiply add
GL_REG0_ATI,GL_NONE, //Zielregister, keine Maske
GL_REG1_ATI,GL_NONE,GL_NONE, //Operand 1
GL_REG2_ATI,GL_NONE,GL_NONE,
GL_REG3_ATI,GL_NONE,GL_NONE);

Diese Ops werden innerhalb eines glBeginFragmentShaderATI /glEndFragmentShaderATI-Paares definiert und bilden zusammen das Shaderprogramm.

Man kann (ähnlich wie Texturobjekte) mit glGenFragmentShadersATI und glDeleteFragmentShadersATI Shaderobjekte erzeugen, die man mit glBindFragmentShaderATI binden kann.

Den Rest habe ich jetzt nicht genau im Kopf :)

Nasenbaer
2002-11-25, 17:39:28
Es ging mir eigentlich nur darum ob eine Konvertierung von nV-Umsetzung nach ATi-Umsetzung der Pixel-/ Vertexshader Programme einfach ist. :)
Ohnung hab ich davon noch keine - wollte nur wissen ob der Kauf nicht umsonst war.

Mfg Nasenbaer

zeckensack
2002-11-25, 18:22:14
Einfach ist's nicht. Das NV-Modell ist irgendwie total anders.

Bei ATI schiebst du eine Befehlssequenz rein, bei NV sind die Befehle fix und du gibst du an, welche Ergebnisse wohin geschrieben werden.

100%ige Umsetzung von Shadern, die die jeweiligen Möglichkeiten voll ausnutzen ist AFAIK garnicht möglich, da man die Grenzen der anderen Architektur überschreiten würde (in jeweils anderen Bereichen).

Der NV25 kann zB theoretisch pro Combiner drei RGB-Ergebnisse produzieren, macht insgesamt 24. ATI_fragment_shader ist aber auf 16 Op-Paare limitiert.

Dafür kannst du bei ATI dependant reads vollständig programmieren, was bei NV nicht geht. Und wenn du bestimmte Befehle innerhalb eines Shaders sehr häufig nutzt, dann ist der R200 wieder überlegen, da der NV25 jeden Operationstyp maximal einmal pro Combiner ausführen kann, also acht mal gegen sechzehn mal bei ATI.

Riesen Minuspunkt bei ATI ist dann wieder, daß unter OpenGL das Schreiben von Z-Werten nicht verfügbar ist (die HW kann's, siehe D3D).

Kurzform:
Die Architekturen sind stark unterschiedlich, da mußt du schauen was für Shader du schreiben willst und dann durchgehen ob sie auf beide Karten 'passen'.

Demirug
2002-11-26, 07:52:11
Originally posted by firewars
Stichwort Vertex-/Pixelshader: Sollte jemand sonstige Tutorials haben, her damit ;)
Danke :D

Auf dieser Seite gibt es eine ganz brauchbare Einführung in das Thema http://www.shaderx.com/direct3d.net/index.html ist wie der name aber schon vermuten läst auf DirectX bezogen.