PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GLSL


Gast
2004-01-09, 21:18:03
Benutzt das schon irgendwer hier? Ich acker mich gerade durch die Specs...:)

Was haltet ihr davon? Auf mich macht das ganze einen recht durchdachten Eindruck, kann aber durchaus daran liegen dass ich sonst keine Ahnung habe was Vertex/Pixelshading betrifft. Was ist eigentlich der Unterschied zwischen GLSL und Cg? Muss man bei Cg noch mit asm rumfummeln oder ist das schon High Level?

mfg

liquid
2004-01-09, 22:12:39
Cg steht ja für C for Graphics. Deshalb würd ich mal auf high-level tippen (obwohl C ja auch noch ziemlich low-level ist bzw. einem die Möglichkeit des low-level codens ermöglicht).

cya
liquid

Demirug
2004-01-09, 22:36:15
Cg ist Highlevel und entspricht HLSL (der Hochsprache von DX).

Cg ist aber eigentlich nur noch wirklich interesant wenn man Multi-API Engines schreiben will.

Gast
2004-01-10, 10:20:41
Also zwecks der Übersicht: bei OpenGL haben wir auf der asm Seite die Extensions (ARB_fragment_program und Konsorten), auf der Highlevel Seite die GLSL.
Bei DX auf der Highlevel Seite Cg und HLSL. (Was sind da die Unterschiede? Beides von Microsoft? Welche Vorraussetzungen auf Grafikkartenseite?) Gibt es bei DX auch die Möglichkeit asm-Shader zu schreiben? Natürlich gibt es die, Demi wirft uns ja immer wieder kleine Brocken aus seinem Geheimprojekt vor :) Klick (http://80.237.203.42/vbulletin/showthread.php?threadid=117290)
Wie werden die dann in DX integriert? Gibt es da extra Funktionen dafür? (So wie bei OpneGL die asm-Extensions?)

MfG

Demirug
2004-01-10, 17:39:02
Cg kommt von nVidia und unterstützt sowohl DX wie auch OpenGL. Bei OpenGL aber nur nVidia Chips optimal.

Bei DX wird ein Hochsprachenschader immer zuerst in einen Assemblershader übersetzt (das macht der Compiler). Dieser Assemblershader wird dann dem Treiber übergeben. Man kann daher auch bei DX weiterhin Assemblerartige Shader schreiben.

Für HLSL braucht man mindestens eine DX8 Karte wobei man dann natürlich nur kleine Shader schreiben kann. Für Cg gilt das gleiche wie auch für HLSL. für glslang braucht man mindesten eine Karte auf DX9-Level. Eine Ausnahme ist hier der P10.

Gast
2004-01-10, 19:11:55
Original geschrieben von Demirug
Für HLSL braucht man mindestens eine DX8 Karte wobei man dann natürlich nur kleine Shader schreiben kann.

ad DX8 Karte: Das DX Modell baut, wenn ich mich recht erinnere, auf Restriktionen (Caps) auf, im Gegensatz zum Extension Modell von OpenGL. Eine Radeon 8500 wäre demnach fähig einen HLSL-Shader auszuführen?

Original geschrieben von Demirug
für glslang braucht man mindesten eine Karte auf DX9-Level.

Genauer: Eine Karte die
GL_ARB_shader_objects,
GL_ARB_fragment_shader,
GL_ARB_vertex_shader sowie
GL_ARB_shading_language_100 bereitstellt.
Eine FX5900 ist DX9 Level, unterstützt AFAIK aber GLSL (noch) nicht.

Aber genug der Haarspalterei,zurück zu ernsthaften Dingen: So wie ich das bis jetzt mitbekommen habe muss bei GLSL immer ein Vertex/Pixelshader Paar vorhanden sein um einen lauffähigen Shader zu erzeugen. Die Spec sagt:

What to do if part of a shader pair is not present?

DISCUSSION: There are several shader types that go together. For
example, a VERTEX_SHADER and a FRAGMENT_SHADER form a pair that is part
of the geometry pipeline. It is not required to supply both shader types
of a pair in a program object.

RESOLUTION: If one or the other of a pair is not present in the program
object, OpenGL will substitute the standard 1.4 OpenGL pipeline for the
one not present. The most likely place for this substitution to happen
is the link stage. Note that it is defined elsewhere exactly what part
of the OpenGL 1.4 pipeline a shader replaces.


Der Sinn dieses Textes erschließt sich mir nicht ganz. Bitte um Aufklärung.

Leute berichteten auch dass z.B. nur ein Vertex Shader alleine nicht lauffähig sei. Weiß hier irgendwer was genaueres?

MfG

Demirug
2004-01-10, 19:58:54
Original geschrieben von Gast
ad DX8 Karte: Das DX Modell baut, wenn ich mich recht erinnere, auf Restriktionen (Caps) auf, im Gegensatz zum Extension Modell von OpenGL. Eine Radeon 8500 wäre demnach fähig einen HLSL-Shader auszuführen?

Da ich ein positiver Mensch bin spreche ich lieber von Fähigkeiten (caps = capabilities). Die Caps stellen dabei eine Liste da was eine Karte/Chip alles kann. Dabei gibt es zwei Werte die angeben welcher Shaderversion von einer Karte unterstützt wird. Zwei Werte weil Vertex und Pixelshader getrennt aufgeführt werden. Es wird immer nur die beste unterstütze Version angebene. Die Regeln schreiben aber vor das eine Karte aber auch alle kleineren Versionen unterstützen muss.

Ein in HLSL programmiert Shader muss ja nun durch den Compiler übersetzt werden. Dabei gibt man an für welche Shaderversion das geschehen soll. Der Compiler kann aber neben reinen Syntaxfehler auch erkennen wenn man etwas tun möchte was über die Fähigkeiten der Zielversion hinausgeht. In beiden Fällen wird das compilieren abgebrochen. Ist alles in Ordnung erhält man einen Shader in Form von Shader-Assembler-Code. Diesen kann man dann dem Treiber übergeben.

Eine R8500 kann aufgrund dieses Models jeden HLSL Shader ausführen der sich als Pixelshader der Version 1.4 oder kleiner compilieren lässt. Einen HLSL-Shader der sich nur für PS >= 2.0 compileren lässt wird dort aber nicht laufen.

Genauer: Eine Karte die
GL_ARB_shader_objects,
GL_ARB_fragment_shader,
GL_ARB_vertex_shader sowie
GL_ARB_shading_language_100 bereitstellt.
Eine FX5900 ist DX9 Level, unterstützt AFAIK aber GLSL (noch) nicht.

Aber genug der Haarspalterei,zurück zu ernsthaften Dingen: So wie ich das bis jetzt mitbekommen habe muss bei GLSL immer ein Vertex/Pixelshader Paar vorhanden sein um einen lauffähigen Shader zu erzeugen. Die Spec sagt:


Der Sinn dieses Textes erschließt sich mir nicht ganz. Bitte um Aufklärung.

Leute berichteten auch dass z.B. nur ein Vertex Shader alleine nicht lauffähig sei. Weiß hier irgendwer was genaueres?

MfG

AFAIK kann man auch Vertex bzw Fragment-Programme getrennt nutzten. In solchen Fällen muss man dann für den fehlenden Teil mit standard OpenGL Funktionen arbeiten.

Gast
2004-01-10, 20:43:32
Original geschrieben von Demirug
AFAIK kann man auch Vertex bzw Fragment-Programme getrennt nutzten. In solchen Fällen muss man dann für den fehlenden Teil mit standard OpenGL Funktionen arbeiten.

Wie soll das gehen bzw. was hätte das für einen Sinn? Einer der großen Vorteile von Shadern ist doch gerade dass man im VS Dinge berechene kann die man dann im PS weiterverwendet.

Noch was anderes: In der Vertex program Spec gibt es eine Menge Text die sich mit "Vertex Attributes" beschäftigt. Leider war es mir nicht möglich herauszufinde was das denn genau ist.

The commands

void VertexAttrib{1234}{sfd}ARB(uint index, T values)
void VertexAttrib{123}{sfd}vARB(uint index, T values)
void VertexAttrib4{bsifd ubusui}vARB(uint index, T values)

can be used to load the given value(s) into the generic attribute at
slot <index>, whose components are named <x>, <y>, <z>, and <w>. The
VertexAttrib1*ARB family of commands sets the <x> coordinate to the
provided single argument while setting <y> and <z> to 0 and <w> to 1.
Similarly, VertexAttrib2*ARB commands set <x> and <y> to the specified
values, <z> to 0 and <w> to 1; VertexAttrib3*ARB commands set <x>, <y>,
and <z>, with <w> set to 1, and VertexAttrib4*ARB commands set all four
coordinates. The error INVALID_VALUE is generated if <index> is greater
than or equal to MAX_VERTEX_ATTRIBS_ARB.

Mir scheint da geht es darum die Vertexposition zu ändern. Da das aber einfacher auch geht kann es doch wohl nicht alles sein was man mit diesen Vertex Attributes machen kann. Irgendjemand der hier etwas weiß?

p.s: Danke an Demirug für seine (bald als unermüdlich zu bezeichnenden) Bemühungen mein Wissen zu erweitern. Danke Demi :)

MfG

zeckensack
2004-01-10, 20:53:44
Original geschrieben von Gast
Wie soll das gehen bzw. was hätte das für einen Sinn? Einer der großen Vorteile von Shadern ist doch gerade dass man im VS Dinge berechene kann die man dann im PS weiterverwendet.Es gibt aber genügend Situationen, wo man das nicht braucht. ZB für Animation (VS und klassisches Multitexturing), oder für reine Oberflächeneffekte auf statischen Objekten, oder Postpro (jeweils nur PS).

In diesen Fällen muss man dann den 'fehlenden' Rest nicht mehr selbst schreiben.
Noch was anderes: In der Vertex program Spec gibt es eine Menge Text die sich mit "Vertex Attributes" beschäftigt. Leider war es mir nicht möglich herauszufinde was das denn genau ist.

Mir scheint da geht es darum die Vertexposition zu ändern. Da das aber einfacher auch geht kann es doch wohl nicht alles sein was man mit diesen Vertex Attributes machen kann. Irgendjemand der hier etwas weiß?Generische VAs sind eine Übermenge der klassischen Attribute (Position, zweimal Farbe, Texturkoordinaten, Fog Coord). Das Ziel ist hier nur eine höhere Abstraktion. Der Shader-Programmierer muss sich dann nicht mehr darum kümmern, ob ein Attribut via "Texturkoordinate 0" übertragen wird, er kann es einfach beim Namen nennen. Das eröffnet auch Potential für HW-/Treiber-Optimierungen.

Gast
2004-01-10, 21:05:54
Original geschrieben von zeckensack
Generische VAs sind eine Übermenge der klassischen Attribute (Position, zweimal Farbe, Texturkoordinaten, Fog Coord). Das Ziel ist hier nur eine höhere Abstraktion. Der Shader-Programmierer muss sich dann nicht mehr darum kümmern, ob ein Attribut via "Texturkoordinate 0" übertragen wird, er kann es einfach beim Namen nennen. Das eröffnet auch Potential für HW-/Treiber-Optimierungen.

D.h. statt Vertex.Texcoord[0]=1 binde ich das Attribut Vertex.Texcoord[0] auf eiene freien slot, nenne das ganze tex0 und kann künftig sagen tex0=1? So ungefähr? (Ich habe Probleme mir ein sinnvolles Anwendungsbeispiel vorzustellen)

btw. Was hast du mit deinem avatar gemacht? Die schöne Zipfelmütze! (Sig ändern nicht vergessen)
Wie wärs denn wiedermal mit dem legendären "Hackfresse" Avatar? :D

MfG

zeckensack
2004-01-10, 21:42:13
Original geschrieben von Gast
D.h. statt Vertex.Texcoord[0]=1 binde ich das Attribut Vertex.Texcoord[0] auf eiene freien slot, nenne das ganze tex0 und kann künftig sagen tex0=1? So ungefähr? (Ich habe Probleme mir ein sinnvolles Anwendungsbeispiel vorzustellen)
[SIZE]Jein. Sinnvoller wäre es zB die Attribute "tangent" und "binormal" zu nehmen.
[SIZE=1]btw. Was hast du mit deinem avatar gemacht? Die schöne Zipfelmütze! (Sig ändern nicht vergessen)Thx, die Sig wurde soeben korrigiert. Ich huldige mit dem Avatar dem IMO mit Abstand besten Spiel des Jahres 2003 :)
Ein, zwei Wochen muss das Metroidelein erstmal bleiben.
Wie wärs denn wiedermal mit dem legendären "Hackfresse" Avatar? :D

MfG Siehe oben. Nach der Ehrenfrist gibt's wieder mich, in irgendeiner Form :naughty: