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:
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?
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?