Toon posts:

[GLSL] fragment shader trekt het niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo!

Ik ben bezig met wat leuke (shader)effectjes in mn hippe MMORPG, maar ik loop tegen een curieus probleem aan. In mijn fragment shader zit nu een texture2D voor de textures en een texture2DProj voor de shadowmap, een simpele berekening voor fog en verder de standaard simpele dingetjes voor de berekening van de kleur op basis van de light0positie.

Niets heftigs zou je zo zeggen, maar ik loop toch tegen een of andere grens aan. Als ik nog iets toevoeg, bijv een specularberekening, lijkt de kaart (ATI Radeon 9600 TX) terug te vallen op software (of er gaat iig iets mis waardoor ik iets van 0.1fps krijg).

Het ligt niet aan een specifiek stukje van de shader, want als ik bijv de shadowmap uitzet kan ik de specular berekening wel op een fatsoenlijke fps doen. zo zijn er wel meer combinaties mogelijk van stukjes uitzetten waardoor ik er weer iets anders wel bij kan zetten.

Lijkt me toch sterk dat ik tegen de grenzen van de kaart aanloop (aantal instructies? geheugen?), want als ik kijk naar een willekeurig commercieel spel dan loopt het prima op mijn kaart, terwijl daar naast shadowmaps ook bumpmaps, lightmaps en nog veel meer fragment onzin wordt berekend. Zie ik iets over het hoofd?

hier de code van de shader:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
varying vec4 diffuse, ambient;
varying vec3 normal, lightDir, halfVector;
uniform sampler2D tex;
uniform sampler2D shadowmap;
varying float distance;
varying vec4 shadowcoord;

void main() {
  vec3 halfV, n;
  float NdotL, NdotHV, R, A;
  float shadowcolor;

  vec4 color = ambient;

  n = normalize(normal);
  NdotL = max(dot(n, lightDir), 0.0);

  if (NdotL > 0.0) {
    color += diffuse * NdotL;
    halfV = normalize(halfVector);
    NdotHV = max(dot(n, halfV), 0.0);
    color += gl_FrontMaterial.specular * gl_LightSource[0].specular * pow(NdotHV, gl_FrontMaterial.shininess);
  }

  vec4 texcolor = texture2D(tex, gl_TexCoord[0].st);

  A = texture2DProj(shadowmap, shadowcoord).r;
  R = shadowcoord.p / shadowcoord.q;
  shadowcolor = (R <= A) ? 1.0 : 0.8;

  color += gl_FrontMaterial.emission;

  vec4 endcolor;
  if (texcolor.rgb != 0.0) {
    endcolor = color * texcolor;
  } else {
    endcolor = color * gl_FrontMaterial.diffuse;
  }

  endcolor = endcolor * shadowcolor;
  
  vec4 fogcolor = vec4(0.6, 0.73, 0.9, 1.0);
  endcolor = mix(endcolor, gl_LightSource[0].diffuse * fogcolor, min(distance, 1000.0) / 1000.0);
  endcolor.a = 0.5;

  gl_FragColor = endcolor;
}


deze code werkt dus NIET (op een fatsoenlijke fps), als ik nu het stukje van de specular (in de 'if NdotL > 0.0' etc) uitzet werkt het wel, of als ik het stukje shadowmap uitzet werkt het, of als ik de fog uitzet.. etc..

iemand enig idee tegen welke limiet ik aanloop en waarom?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wellicht ga je over de instructielimiet van je kaart door die extra berekeningen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
jep dat zou kunnen, maar hoe kan het dan dat in commerciele spellen zoveel meer effecten worden gebruikt zonder dat probleem? zoveel bijzonders zit er toch niet in mijn shader :/

en ik moet ook nog nondirectional lights er in zien te proppen :o

[ Voor 33% gewijzigd door Verwijderd op 03-02-2007 19:24 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Klopt, maar ik weet ook niet welk shader model je gebruikt. PS1.4 en eerder waren namelijk niet heel erg boeiend wat dat betreft :)

Wij hebben 2.0 zelfs gedropped wegens de instructielimiet. Dan moet je een pass per light gaan doen, dat schiet niet op.


Overigens, hiermee is nog niet gezegd dat dat ook echt de oorzaak is. Om dat uit te sluiten zou je de assembly output eens moeten bestuderen.

[ Voor 54% gewijzigd door .oisyn op 03-02-2007 20:06 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
bedankt, daar ga ik dan eens naar kijken :)
kun je gewoon een shader model 'selecteren' of ligt dat puur aan je kaart?

Verwijderd

Je zou kunnen proberen gebruik te maken van een normalization cubemap ipv de functie normalize.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op zondag 04 februari 2007 @ 14:35:
bedankt, daar ga ik dan eens naar kijken :)
kun je gewoon een shader model 'selecteren' of ligt dat puur aan je kaart?
Allebei; je moet kijken welk model je kaart ondersteunt, en dan niet hoger gaan dan dat. Wat voor videokaart heb je eigenlijk?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
.oisyn schreef op maandag 05 februari 2007 @ 13:57:
[...]

Allebei; je moet kijken welk model je kaart ondersteunt, en dan niet hoger gaan dan dat. Wat voor videokaart heb je eigenlijk?
lijkt de kaart (ATI Radeon 9600 TX) terug
O-) *oehoe ik draag iets bij aan dit topic

~ Mijn prog blog!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Right. Dat is een SM 2.0 kaart als ik me niet vergis. Als je code naar sm 2.0 compilet dan zou dat wel genoeg moeten zijn imho.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
hoe doe ik dat? kan het echt nergens vinden :s zijn er stiekeme parameters bij de functies van opengl's linkprogram ed waar je dat in kunt stellen?

nog een vraagje tussendoor; textures voelen zich in opengl fijner in 2^x * 2^x formaat, maar mijn textures zijn vaak van andere afmetingen (geen machten van 2). op zich werkt het prima, maar zou er een snelheidswinst zijn als ik alles omzet?

even een screenshotje tussendoor om te patsen met mijn progress tot nu toe :P

Afbeeldingslocatie: http://www.ranchorelaxo.nl/bitplane/screenshot50_small.jpg

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Snelheidswinst was vroeger misschien zo (toen non-pow-2 texture support nog een zeldzame feature was), tegenwoordig maakt het geen zak meer uit.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1