PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CG vs GLSL


Matti
2004-12-03, 19:53:45
die beiden Shader-Sprachen sind ja ziemlich ähnlich, aber was sind die jeweiligen Vor- & Nachteile?

CG ist auch unter DX nutzbar ... was gibt's sonst noch für Unterschiede?

marco42
2004-12-03, 22:10:30
die beiden Shader-Sprachen sind ja ziemlich ähnlich, aber was sind die jeweiligen Vor- & Nachteile?

CG ist auch unter DX nutzbar ... was gibt's sonst noch für Unterschiede?

GLSL ist standard unter OpenGL. ich kenne mich mit CG nicht so gut aus, aber ich mag ein paar dinge, wie varyings, unter GLSL besser. das interface unter OpenGL bietet die moeglichkeit mehre shader object zusammen zulinken. du kannst also also die shader objects schon vorkompilieren und dann linkten. das macht sich sehr gut, wenn du shading trees aufbauen willst. dass kannst du natuerlich auf string ebene genauso mit CG machen. GLSL ist etwas stricter, aber das ist IMHO gut, besser als jetzt zu viel muell in die sprache zu lassen, der spaeter noch mit herum geschleppt werden muss. ok, sowas ist fuer spiele eher weniger intessant. aber fuer applicationen mit ueber 10 Jahren entwicklungszeit doch eher. deswegen ist opengl in dem bereich ja auch so sehr verbreitet. D3D aendert sein interface von version zu version und sowas produziert kosten. fuer spiele ist sowas natuerlich von vorteil. manche interfaces unter OpenGL sind doch schon arg angestaubt. ich persoenlich finde das object interface der shader wesentlich besser, als der alte, das bei texture objects verwendet wurde. aber imho ist das nicht so schlimm. ein glSampler interface waere ganz nett. :-)

marco42
2004-12-03, 23:09:33
Nvidia benutzt ja den CG compiler im treiber auch als GLSL compiler. ich habe mal die 1.3 stand alone version ausprobiert. du kannst da anscheinend D3D code generieren.

z.B.:
void main()
{
vec4 color;
color.r = floor(gl_TexCoord[0].s * 256.)/256.;
color.g = frac(gl_TexCoord[0].s * 256.) ;
color.b = floor(gl_TexCoord[0].t * 256.)/256. ;
color.a = frac(gl_TexCoord[0].t * 256.) ;
gl_FragColor = color;
}

erzeugt:
12 lines, 0 errors.
ps_2_0
// cgc version 1.3.0001, build date Aug 4 2004 10:24:23
// command line args: -oglsl -profile ps_2_0
// source file: test.frag.glsl
//vendor NVIDIA Corporation
//version 1.0.02
//profile ps_2_0
//program main
//var float4 gl_TexCoord[0] : $vin.TEX0 : TEX0 : -1 : 1
//var float4 gl_TexCoord[1] : : : -1 : 0
//var float4 gl_TexCoord[2] : : : -1 : 0
//var float4 gl_TexCoord[3] : : : -1 : 0
//var float4 gl_TexCoord[4] : : : -1 : 0
//var float4 gl_TexCoord[5] : : : -1 : 0
//var float4 gl_TexCoord[6] : : : -1 : 0
//var float4 gl_TexCoord[7] : : : -1 : 0
//var float4 gl_FragColor : $vout.COL : COL : -1 : 1
//const c[0] = 256
def c0, 256.000000, 0.000000, 0.000000, 0.000000
mul r0.x, t0, c0
mul r1.x, t0.y, c0
frc r2.x, r0
add r3.x, r0, -r2
frc r4.x, r1
rcp r2.x, c0.x
add r4.x, r1, -r4
mul r2.z, r4.x, r2.x
mul r2.x, r3, r2
frc r2.w, r1.x
frc r2.y, r0.x
mov oC0, r2

frag mich bloss nicht, ob dass jetzt funktioniert. :-)
demirug meinte mal, der CG compiler waere nicht so gut, wie der von MS, das ist also mit vorsicht zugeniessen.

Matti
2004-12-04, 19:15:19
welche Extensions braucht man eigentlich, um CG-Shader in OpenGL zu nutzen?

marco42
2004-12-04, 22:14:46
welche Extensions braucht man eigentlich, um CG-Shader in OpenGL zu nutzen?

Da du verschiedene Profile generieren kannst, kommt es darauf an. Du kannst auch immer nur bestimmte Funktionen pro Profile benutzen. Du kannst aber auch das GLSL Interface mit GL_EXT_Cg_shader benutzen. Du laedst dann hat Cg Text shader und nicht mehr GLSL shader. Fuer GLSL brauchst du mindestens eine FX, da gehen dann halt bloss viele Sachen nicht. AFAIK gibt es noch keine Karte, die GLSL vollstaendig in Hardware hat. dem NV40 fehlen da die noise funktionen. Die neuen 3Dlabs Karten koennen das vielleicht, aber sowas hatte ich noch nicht zwischen den Fingern.

Demirug
2004-12-04, 23:34:25
frag mich bloss nicht, ob dass jetzt funktioniert. :-)
demirug meinte mal, der CG compiler waere nicht so gut, wie der von MS, das ist also mit vorsicht zugeniessen.

Wenn man ein bischen aufpasst kann man den Cg Code auch mit dem MS Compiler benutzen. Cg und HLSL benutzen ja den gleichen Syntax.

marco42
2004-12-05, 02:04:41
Wenn man ein bischen aufpasst kann man den Cg Code auch mit dem MS Compiler benutzen. Cg und HLSL benutzen ja den gleichen Syntax.

naja, hier ging es ja um GLSL input, den der Cg 1.3 compiler jetzt verarbeitet. Eigentlich sollte es kein problem sein, dass in HLSL umzuwandeln. Ich weiss halt bloss nicht, wie es bei HLSL mit mehreren Objecten(gemeinsame globale Variablen) steht. Cg kann das ja AFAIK nicht. Mittlerweile finde ich GLSL immer mehr besser designed wie Cg. Allein, wie die uniforms und varyings geloesst wurden, sind IMHO besser. Auch das man mehrere Object anlegen kann. Fuer mich wirkt Cg wie ein Schnellschuss, aber das ist Aestetik.