Shader (historisch): Unterschied zwischen den Versionen
(=Funktionen=) |
|||
Zeile 38: | Zeile 38: | ||
---- | ---- | ||
<ul> | <ul> | ||
+ | <li>[[glAttachObjectARB]]</li> | ||
+ | <li>[[glBindAttribLocationARB]]</li> | ||
+ | <li>[[glCompileShaderARB]]</li> | ||
<li>[[glCreateProgramObjectARB]]</li> | <li>[[glCreateProgramObjectARB]]</li> | ||
<li>[[glCreateShaderObjectARB]]</li> | <li>[[glCreateShaderObjectARB]]</li> | ||
− | <li>[[ | + | <li>[[glDeleteObjectARB]]</li> |
− | <li>[[ | + | <li>[[glDetachObjectARB]]</li> |
− | <li>[[ | + | <li>[[glEnableVertexAttribArrayARB]]</li> |
+ | <li>[[glGetActiveAttribARB]]</li> | ||
+ | <li>[[glGetActiveUniformARB]]</li> | ||
+ | <li>[[glGetAttachedObjectsARB]]</li> | ||
+ | <li>[[glGetAttribLocationARB]]</li> | ||
+ | <li>[[glGetHandleARB]]</li> | ||
<li>[[glGetInfoLogARB]]</li> | <li>[[glGetInfoLogARB]]</li> | ||
− | |||
<li>[[glGetObjectParameterARB]]</li> | <li>[[glGetObjectParameterARB]]</li> | ||
+ | <li>[[glGetShaderSourceARB]]</li> | ||
+ | <li>[[glGetUniformARB]]</li> | ||
+ | <li>[[glGetUnifromLocationARB]]</li> | ||
+ | <li>[[glGetVertexAttribARB]]</li> | ||
+ | <li>[[glGetVertexAttribPointervARB]]</li> | ||
+ | <li>[[glLinkProgramARB]]</li> | ||
+ | <li>[[glShaderSourceARB]]</li> | ||
<li>[[glUniformARB]]</li> | <li>[[glUniformARB]]</li> | ||
− | <li>[[ | + | <li>[[glUseProgramObjectARB]]</li> |
+ | <li>[[glValidateProgramARB]]</li> | ||
+ | <li>[[glVertexAttribARB]]</li> | ||
+ | <li>[[glVertexAttribPointerARB]]</li> | ||
</ul> | </ul> | ||
<br> | <br> | ||
+ | |||
== Ressourcen == | == Ressourcen == | ||
---- | ---- |
Version vom 12. Juli 2004, 13:51 Uhr
Inhaltsverzeichnis
Shader
Konzept
Die traditionelle Funktionspipeline der OpenGL ist eine feste Pipeline, auf die man nur beschränkt Einfluß nehmen kann (durch Statechanges), man hat also an sehr vielen Stellen starre Vorgaben die nur minimal anpassbar sind. So sind z.B. Farbberechnungen oder die Beleuchtung fest definiert und nur wenige ihrere Attribute können variiert werden. Zurückzuführen war/ist dieser Umstand v.a. darauf dass Grafikkarten bis vor kurzem nur feste Berechnungseinheiten besaßen, die man auch nicht programmieren konnte. (siehe z.B. die fest verdrahtete T&L-Einheit der ersten GeForce-Karten)
Allerdings haben vor einigen Jahren Grafikkarten mit teilweise programmierbaren Einheiten (erst waren dies recht eingeschränkt programmierbare Vertexeinheiten, inzwsichen sind selbst die Fragmentprozessoren recht frei programmierbar, siehe z.B. VS/PS3.0) Einzug in den Consumermarkt gefunden, und so war es nötig OpenGL auch um programmierbare Pipeline-Teile zu erweitern, und die neuste Inkarnation sind dabei Shader.
Seit neustem gibt es neben den herstellerabhängigen Funktionen zum Programmieren der Vertex- und Fragmentprozessoren auch standardisierte Erweiterungen. Zuerst waren dies GL_VERTEX_PROGRAM_ARB/GL_FRAGMENT_PROGRAM_ARB, mit denen man diese beiden Prozessoren (sofern auf der Grafikkarte vorhanden) in einer an Assembler (recht primitiv, mit nur wenigen Befehlen, alle auf Grafikprogrammierung ausgelegt) angelehnten Sprache programmieren konnte. Man schreibt dazu also ein Programm dass den entsprechenden Teil der festen Funktionspipeline ersetzt und führt dieses dann auf der Grafikkarte aus. So kann man für Vertices und Fragmente komplett eigene Berechnungen durchführen. Allerdings ist eine solche Assemblersprache nicht nur recht eingeschränkt, sondern auch recht kryptisch und daher nicht zuletzt (besonders bei großen Programmen) schlecht zu warten. Also hat OpenGL hier genau wie die normalen Programmiersprachen als nächste Iteration für programmierbare Teile der Pipeline eine Hochsprache verpasst bekommen, namentlich als glSlang bekannt.
Hiessen die Programme unter der Assemblersprache noch (passen) Vertexprogramm bzw. Fragmentprogramm, so hat man sich unter glSlang etwas angepasst (an D3D) und nennt diese nun Vertexshader bzw. Fragmentshader (Shader bedeutet "schattieren", stimmt also nicht 100%ig).
Diese Shader kann man wie angesprochen nun in einer an C angelehnten Hochsprache schreiben, was zur Folge hat dass sich die Programmierung der entsprechenden Grafikprozessoren reichlich vereinfacht hat, und ausserdem hat man glSlang um recht viele Dinge erweitert die in der Assemblersprache nicht (oder nicht gerade einfach) möglich waren. Darunter Schleifen, Funktionen, uvm.
Voraussetzungen
Shader sind ein recht neues Konzept unter OpenGL und mit glSlang wollte man eine reichlich zukunftsorientierte Hochsprache für Shader schaffen. Deshalb hat man gleich auf alte Shaderversionen verzichtet und setzt Vertexshader und Pixelshader in der Version 2.0 voraus, die bei ATI ab der Radeon 9500 und bei NVidia ab der Geforce FX zur Verfügung stehen.
Momentan stellt glSlang eine Erweiterung zur OpenGL-Version 1.5 dar, also benötigt man neben der oben erwähnten Hardware auch noch passende Treiber und OpenGL-Header. Für Delphi bietet die DGL einen eigenen Header an, der diese Funktionalität mitbringt (Download).
Extensions
- GL_ARB_Shader_Objects
- GL_ARB_Vertex_Shader
- GL_ARB_Fragment_Shader
- GL_ARB_Shading_Language_100
Definiert die API-Aufrufe die zum Erstellen, Kompilieren, Linken, Anhängen und Aktivieren von Shader- und Programmobjekten nötig sind.
Fügt der OpenGL Programmierbarkeit auf Vertexebene hinzu.
Fügt der OpenGL Programmierbarkeit auf Fragmentebene hinzu.
Gibt die unterstützte Version von glSlang an, momentan 1.00.
Funktionen
- glAttachObjectARB
- glBindAttribLocationARB
- glCompileShaderARB
- glCreateProgramObjectARB
- glCreateShaderObjectARB
- glDeleteObjectARB
- glDetachObjectARB
- glEnableVertexAttribArrayARB
- glGetActiveAttribARB
- glGetActiveUniformARB
- glGetAttachedObjectsARB
- glGetAttribLocationARB
- glGetHandleARB
- glGetInfoLogARB
- glGetObjectParameterARB
- glGetShaderSourceARB
- glGetUniformARB
- glGetUnifromLocationARB
- glGetVertexAttribARB
- glGetVertexAttribPointervARB
- glLinkProgramARB
- glShaderSourceARB
- glUniformARB
- glUseProgramObjectARB
- glValidateProgramARB
- glVertexAttribARB
- glVertexAttribPointerARB