-
-
Couldn't load subscription status.
- Fork 1.2k
Closed
Milestone
Description
Get a NB_PROBES is not defined error in the shader.
Environment:
2020-04-01 10:39:56,603 INFO [main] com.jme3.system.JmeDesktopSystem (JmeDesktopSystem.java:345) - Running on jMonkeyEngine 3.3.0-stable
* Branch: HEAD
* Git Hash: 391e0dc
* Build Date: 2020-03-30
2020-04-01 10:39:56,863 INFO [jME3 Main] com.jme3.system.lwjgl.LwjglContext (LwjglContext.java:100) - LWJGL 2.9.3 context running on thread jME3 Main
* Graphics Adapter: null
* Driver Version: null
* Scaling Factor: 1
2020-04-01 10:39:56,879 INFO [jME3 Main] com.jme3.renderer.opengl.GLRenderer (GLRenderer.java:538) - OpenGL Renderer Information
* Vendor: ATI Technologies Inc.
* Renderer: AMD Radeon Pro Vega 20 OpenGL Engine
* OpenGL Version: 4.1 ATI-2.11.20
* GLSL Version: 4.10
* Profile: Core
Stacktrace:
2020-04-01 10:40:03,000 WARN [jME3 Main] com.jme3.renderer.opengl.GLRenderer (GLRenderer.java:1473) - Bad compile of:
1 #version 150 core
2 #define SRGB 1
3 #define FRAGMENT_SHADER 1
4 #define BASECOLORMAP 1
5 #define EMISSIVE 1
6 #define NUM_BONES 30
7 #define NORMAL_TYPE -1.0
8 #define SINGLE_PASS_LIGHTING 1
9 #define NB_LIGHTS 3
10 #extension GL_ARB_shader_texture_lod : enable
11 // -- begin import Common/ShaderLib/GLSLCompat.glsllib --
12 #if defined GL_ES
13 # define hfloat highp float
14 # define hvec2 highp vec2
15 # define hvec3 highp vec3
16 # define hvec4 highp vec4
17 # define lfloat lowp float
18 # define lvec2 lowp vec2
19 # define lvec3 lowp vec3
20 # define lvec4 lowp vec4
21 #else
22 # define hfloat float
23 # define hvec2 vec2
24 # define hvec3 vec3
25 # define hvec4 vec4
26 # define lfloat float
27 # define lvec2 vec2
28 # define lvec3 vec3
29 # define lvec4 vec4
30 #endif
31
32 #if __VERSION__ >= 130
33 # ifdef GL_ES
34 out highp vec4 outFragColor;
35 # else
36 out vec4 outFragColor;
37 #endif
38 # define texture1D texture
39 # define texture2D texture
40 # define texture3D texture
41 # define textureCube texture
42 # define texture2DLod textureLod
43 # define textureCubeLod textureLod
44 # define texture2DArray texture
45 # if defined VERTEX_SHADER
46 # define varying out
47 # define attribute in
48 # elif defined FRAGMENT_SHADER
49 # define varying in
50 # define gl_FragColor outFragColor
51 # endif
52 #else
53 # define isnan(val) !(val<0.0||val>0.0||val==0.0)
54 #endif
55
56
57 // -- end import Common/ShaderLib/GLSLCompat.glsllib --
58 // -- begin import Common/ShaderLib/PBR.glsllib --
59 #ifndef PI
60 #define PI 3.14159265358979323846264
61 #endif
62
63 //Specular fresnel computation
64 vec3 F_Shlick(float vh, vec3 F0){
65 float fresnelFact = pow(2.0, (-5.55473*vh - 6.98316) * vh);
66 return mix(F0, vec3(1.0, 1.0, 1.0), fresnelFact);
67 }
68
69 vec3 sphericalHarmonics( const in vec3 normal, const vec3 sph[9] ){
70 float x = normal.x;
71 float y = normal.y;
72 float z = normal.z;
73
74 vec3 result = (
75 sph[0] +
76
77 sph[1] * y +
78 sph[2] * z +
79 sph[3] * x +
80
81 sph[4] * y * x +
82 sph[5] * y * z +
83 sph[6] * (3.0 * z * z - 1.0) +
84 sph[7] * (z * x) +
85 sph[8] * (x*x - y*y)
86 );
87
88 return max(result, vec3(0.0));
89 }
90
91
92 float PBR_ComputeDirectLight(vec3 normal, vec3 lightDir, vec3 viewDir,
93 vec3 lightColor, vec3 fZero, float roughness, float ndotv,
94 out vec3 outDiffuse, out vec3 outSpecular){
95 // Compute halfway vector.
96 vec3 halfVec = normalize(lightDir + viewDir);
97
98 // Compute ndotl, ndoth, vdoth terms which are needed later.
99 float ndotl = max( dot(normal, lightDir), 0.0);
100 float ndoth = max( dot(normal, halfVec), 0.0);
101 float hdotv = max( dot(viewDir, halfVec), 0.0);
102
103 // Compute diffuse using energy-conserving Lambert.
104 // Alternatively, use Oren-Nayar for really rough
105 // materials or if you have lots of processing power ...
106 outDiffuse = vec3(ndotl) * lightColor;
107
108 //cook-torrence, microfacet BRDF : http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf
109
110 float alpha = roughness * roughness;
111
112 //D, GGX normaal Distribution function
113 float alpha2 = alpha * alpha;
114 float sum = ((ndoth * ndoth) * (alpha2 - 1.0) + 1.0);
115 float denom = PI * sum * sum;
116 float D = alpha2 / denom;
117
118 // Compute Fresnel function via Schlick's approximation.
119 vec3 fresnel = F_Shlick(hdotv, fZero);
120
121 //G Shchlick GGX Gometry shadowing term, k = alpha/2
122 float k = alpha * 0.5;
123
124 /*
125 //classic Schlick ggx
126 float G_V = ndotv / (ndotv * (1.0 - k) + k);
127 float G_L = ndotl / (ndotl * (1.0 - k) + k);
128 float G = ( G_V * G_L );
129
130 float specular =(D* fresnel * G) /(4 * ndotv);
131 */
132
133 // UE4 way to optimise shlick GGX Gometry shadowing term
134 //http://graphicrants.blogspot.co.uk/2013/08/specular-brdf-reference.html
135 float G_V = ndotv + sqrt( (ndotv - ndotv * k) * ndotv + k );
136 float G_L = ndotl + sqrt( (ndotl - ndotl * k) * ndotl + k );
137 // the max here is to avoid division by 0 that may cause some small glitches.
138 float G = 1.0/max( G_V * G_L ,0.01);
139
140 float specular = D * G * ndotl;
141
142 outSpecular = vec3(specular) * fresnel * lightColor;
143 return hdotv;
144 }
145
146 vec3 integrateBRDFApprox( const in vec3 specular, float roughness, float NoV ){
147 const vec4 c0 = vec4( -1, -0.0275, -0.572, 0.022 );
148 const vec4 c1 = vec4( 1, 0.0425, 1.04, -0.04 );
149 vec4 r = roughness * c0 + c1;
150 float a004 = min( r.x * r.x, exp2( -9.28 * NoV ) ) * r.x + r.y;
151 vec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;
152 return specular * AB.x + AB.y;
153 }
154
155 // from Sebastien Lagarde https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf page 69
156 vec3 getSpecularDominantDir(const in vec3 N, const in vec3 R, const in float realRoughness){
157 vec3 dominant;
158
159 float smoothness = 1.0 - realRoughness;
160 float lerpFactor = smoothness * (sqrt(smoothness) + realRoughness);
161 // The result is not normalized as we fetch in a cubemap
162 dominant = mix(N, R, lerpFactor);
163
164 return dominant;
165 }
166
167 vec3 ApproximateSpecularIBL(samplerCube envMap,sampler2D integrateBRDF, vec3 SpecularColor , float Roughness, float ndotv, vec3 refVec, float nbMipMaps){
168 float Lod = sqrt( Roughness ) * (nbMipMaps - 1.0);
169 vec3 PrefilteredColor = textureCubeLod(envMap, refVec.xyz,Lod).rgb;
170 vec2 EnvBRDF = texture2D(integrateBRDF,vec2(Roughness, ndotv)).rg;
171 return PrefilteredColor * ( SpecularColor * EnvBRDF.x+ EnvBRDF.y );
172 }
173
174 vec3 ApproximateSpecularIBLPolynomial(samplerCube envMap, vec3 SpecularColor , float Roughness, float ndotv, vec3 refVec, float nbMipMaps){
175 float Lod = sqrt( Roughness ) * (nbMipMaps - 1.0);
176 vec3 PrefilteredColor = textureCubeLod(envMap, refVec.xyz, Lod).rgb;
177 return PrefilteredColor * integrateBRDFApprox(SpecularColor, Roughness, ndotv);
178 }
179
180
181 float renderProbe(vec3 viewDir, vec3 worldPos, vec3 normal, vec3 norm, float Roughness, vec4 diffuseColor, vec4 specularColor, float ndotv, vec3 ao, mat4 lightProbeData,vec3 shCoeffs[9],samplerCube prefEnvMap, inout vec3 color ){
182
183 // lightProbeData is a mat4 with this layout
184 // 3x3 rot mat|
185 // 0 1 2 | 3
186 // 0 | ax bx cx | px | )
187 // 1 | ay by cy | py | probe position
188 // 2 | az bz cz | pz | )
189 // --|----------|
190 // 3 | sx sy sz sp | -> 1/probe radius + nbMipMaps
191 // --scale--
192 // parallax fix for spherical / obb bounds and probe blending from
193 // from https://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/
194 vec3 rv = reflect(-viewDir, normal);
195 vec4 probePos = lightProbeData[3];
196 float invRadius = fract( probePos.w);
197 float nbMipMaps = probePos.w - invRadius;
198 vec3 direction = worldPos - probePos.xyz;
199 float ndf = 0.0;
200
201 if(lightProbeData[0][3] != 0.0){
202 // oriented box probe
203 mat3 wToLocalRot = mat3(lightProbeData);
204 wToLocalRot = inverse(wToLocalRot);
205 vec3 scale = vec3(lightProbeData[0][3], lightProbeData[1][3], lightProbeData[2][3]);
206 #if NB_PROBES >= 2
207 // probe blending
208 // compute fragment position in probe local space
209 vec3 localPos = wToLocalRot * worldPos;
210 localPos -= probePos.xyz;
211 // compute normalized distance field
212 vec3 localDir = abs(localPos);
213 localDir /= scale;
214 ndf = max(max(localDir.x, localDir.y), localDir.z);
215 #endif
216 // parallax fix
217 vec3 rayLs = wToLocalRot * rv;
218 rayLs /= scale;
219
220 vec3 positionLs = worldPos - probePos.xyz;
221 positionLs = wToLocalRot * positionLs;
222 positionLs /= scale;
223
224 vec3 unit = vec3(1.0);
225 vec3 firstPlaneIntersect = (unit - positionLs) / rayLs;
226 vec3 secondPlaneIntersect = (-unit - positionLs) / rayLs;
227 vec3 furthestPlane = max(firstPlaneIntersect, secondPlaneIntersect);
228 float distance = min(min(furthestPlane.x, furthestPlane.y), furthestPlane.z);
229
230 vec3 intersectPositionWs = worldPos + rv * distance;
231 rv = intersectPositionWs - probePos.xyz;
232
233 } else {
234 // spherical probe
235 // paralax fix
236 rv = invRadius * direction + rv;
237
238 #if NB_PROBES >= 2
239 // probe blending
240 float dist = sqrt(dot(direction, direction));
241 ndf = dist * invRadius;
242 #endif
243 }
244
245 vec3 indirectDiffuse = vec3(0.0);
246 vec3 indirectSpecular = vec3(0.0);
247 indirectDiffuse = sphericalHarmonics(normal.xyz, shCoeffs) * diffuseColor.rgb;
248 vec3 dominantR = getSpecularDominantDir( normal, rv.xyz, Roughness * Roughness );
249 indirectSpecular = ApproximateSpecularIBLPolynomial(prefEnvMap, specularColor.rgb, Roughness, ndotv, dominantR, nbMipMaps);
250
251 #ifdef HORIZON_FADE
252 //horizon fade from http://marmosetco.tumblr.com/post/81245981087
253 float horiz = dot(rv, norm);
254 float horizFadePower = 1.0 - Roughness;
255 horiz = clamp( 1.0 + horizFadePower * horiz, 0.0, 1.0 );
256 horiz *= horiz;
257 indirectSpecular *= vec3(horiz);
258 #endif
259
260 vec3 indirectLighting = (indirectDiffuse + indirectSpecular) * ao;
261
262 color = indirectLighting * step( 0.0, probePos.w);
263 return ndf;
264 }
265
266
267
268
269
270 // -- end import Common/ShaderLib/PBR.glsllib --
271 // -- begin import Common/ShaderLib/Parallax.glsllib --
272 #if (defined(PARALLAXMAP) || (defined(NORMALMAP_PARALLAX) && defined(NORMALMAP))) && !defined(VERTEX_LIGHTING)
273 vec2 steepParallaxOffset(sampler2D parallaxMap, vec3 vViewDir,vec2 texCoord,float parallaxScale){
274 vec2 vParallaxDirection = normalize( vViewDir.xy );
275
276 // The length of this vector determines the furthest amount of displacement: (Ati's comment)
277 float fLength = length( vViewDir );
278 float fParallaxLength = sqrt( fLength * fLength - vViewDir.z * vViewDir.z ) / vViewDir.z;
279
280 // Compute the actual reverse parallax displacement vector: (Ati's comment)
281 vec2 vParallaxOffsetTS = vParallaxDirection * fParallaxLength;
282
283 // Need to scale the amount of displacement to account for different height ranges
284 // in height maps. This is controlled by an artist-editable parameter: (Ati's comment)
285 parallaxScale *=0.3;
286 vParallaxOffsetTS *= parallaxScale;
287
288 vec3 eyeDir = normalize(vViewDir).xyz;
289
290 float nMinSamples = 6.0;
291 float nMaxSamples = 1000.0 * parallaxScale;
292 float nNumSamples = mix( nMinSamples, nMaxSamples, 1.0 - eyeDir.z ); //In reference shader: int nNumSamples = (int)(lerp( nMinSamples, nMaxSamples, dot( eyeDirWS, N ) ));
293 float fStepSize = 1.0 / nNumSamples;
294 float fCurrHeight = 0.0;
295 float fPrevHeight = 1.0;
296 float fNextHeight = 0.0;
297 float nStepIndex = 0.0;
298 vec2 vTexOffsetPerStep = fStepSize * vParallaxOffsetTS;
299 vec2 vTexCurrentOffset = texCoord;
300 float fCurrentBound = 1.0;
301 float fParallaxAmount = 0.0;
302
303 while ( nStepIndex < nNumSamples && fCurrHeight <= fCurrentBound ) {
304 vTexCurrentOffset -= vTexOffsetPerStep;
305 fPrevHeight = fCurrHeight;
306
307
308 #ifdef NORMALMAP_PARALLAX
309 //parallax map is stored in the alpha channel of the normal map
310 fCurrHeight = texture2D( parallaxMap, vTexCurrentOffset).a;
311 #else
312 //parallax map is a texture
313 fCurrHeight = texture2D( parallaxMap, vTexCurrentOffset).r;
314 #endif
315
316 fCurrentBound -= fStepSize;
317 nStepIndex+=1.0;
318 }
319 vec2 pt1 = vec2( fCurrentBound, fCurrHeight );
320 vec2 pt2 = vec2( fCurrentBound + fStepSize, fPrevHeight );
321
322 float fDelta2 = pt2.x - pt2.y;
323 float fDelta1 = pt1.x - pt1.y;
324
325 float fDenominator = fDelta2 - fDelta1;
326
327 fParallaxAmount = (pt1.x * fDelta2 - pt2.x * fDelta1 ) / fDenominator;
328
329 vec2 vParallaxOffset = vParallaxOffsetTS * (1.0 - fParallaxAmount );
330 return texCoord - vParallaxOffset;
331 }
332
333 vec2 classicParallaxOffset(sampler2D parallaxMap, vec3 vViewDir,vec2 texCoord,float parallaxScale){
334 float h;
335 #ifdef NORMALMAP_PARALLAX
336 //parallax map is stored in the alpha channel of the normal map
337 h = texture2D(parallaxMap, texCoord).a;
338 #else
339 //parallax map is a texture
340 h = texture2D(parallaxMap, texCoord).r;
341 #endif
342 float heightScale = parallaxScale;
343 float heightBias = heightScale* -0.6;
344 vec3 normView = normalize(vViewDir);
345 h = (h * heightScale + heightBias) * normView.z;
346 return texCoord + (h * normView.xy);
347 }
348 #endif
349 // -- end import Common/ShaderLib/Parallax.glsllib --
350 // -- begin import Common/ShaderLib/Lighting.glsllib --
351 /*Common function for light calculations*/
352
353
354 /*
355 * Computes light direction
356 * lightType should be 0.0,1.0,2.0, repectively for Directional, point and spot lights.
357 * Outputs the light direction and the light half vector.
358 */
359 void lightComputeDir(in vec3 worldPos, in float lightType, in vec4 position, out vec4 lightDir, out vec3 lightVec){
360 float posLight = step(0.5, lightType);
361 vec3 tempVec = position.xyz * sign(posLight - 0.5) - (worldPos * posLight);
362 lightVec = tempVec;
363 float dist = length(tempVec);
364 #ifdef SRGB
365 lightDir.w = (1.0 - position.w * dist) / (1.0 + position.w * dist * dist);
366 lightDir.w = clamp(lightDir.w, 1.0 - posLight, 1.0);
367 #else
368 lightDir.w = clamp(1.0 - position.w * dist * posLight, 0.0, 1.0);
369 #endif
370 lightDir.xyz = tempVec / vec3(dist);
371 }
372
373 /*
374 * Computes the spot falloff for a spotlight
375 */
376 float computeSpotFalloff(in vec4 lightDirection, in vec3 lightVector){
377 vec3 L=normalize(lightVector);
378 vec3 spotdir = normalize(lightDirection.xyz);
379 float curAngleCos = dot(-L, spotdir);
380 float innerAngleCos = floor(lightDirection.w) * 0.001;
381 float outerAngleCos = fract(lightDirection.w);
382 float innerMinusOuter = innerAngleCos - outerAngleCos;
383 float falloff = clamp((curAngleCos - outerAngleCos) / innerMinusOuter, step(lightDirection.w, 0.001), 1.0);
384
385 #ifdef SRGB
386 // Use quadratic falloff (notice the ^4)
387 return pow(clamp((curAngleCos - outerAngleCos) / innerMinusOuter, 0.0, 1.0), 4.0);
388 #else
389 // Use linear falloff
390 return falloff;
391 #endif
392 }
393
394 // -- end import Common/ShaderLib/Lighting.glsllib --
395
396 varying vec2 texCoord;
397 #ifdef SEPARATE_TEXCOORD
398 varying vec2 texCoord2;
399 #endif
400
401 varying vec4 Color;
402
403 uniform vec4 g_LightData[NB_LIGHTS];
404 uniform vec3 g_CameraPosition;
405 uniform vec4 g_AmbientLightColor;
406
407 uniform float m_Roughness;
408 uniform float m_Metallic;
409
410 varying vec3 wPosition;
411
412
413 #if NB_PROBES >= 1
414 uniform samplerCube g_PrefEnvMap;
415 uniform vec3 g_ShCoeffs[9];
416 uniform mat4 g_LightProbeData;
417 #endif
418 #if NB_PROBES >= 2
419 uniform samplerCube g_PrefEnvMap2;
420 uniform vec3 g_ShCoeffs2[9];
421 uniform mat4 g_LightProbeData2;
422 #endif
423 #if NB_PROBES == 3
424 uniform samplerCube g_PrefEnvMap3;
425 uniform vec3 g_ShCoeffs3[9];
426 uniform mat4 g_LightProbeData3;
427 #endif
428
429 #ifdef BASECOLORMAP
430 uniform sampler2D m_BaseColorMap;
431 #endif
432
433 #ifdef USE_PACKED_MR
434 uniform sampler2D m_MetallicRoughnessMap;
435 #else
436 #ifdef METALLICMAP
437 uniform sampler2D m_MetallicMap;
438 #endif
439 #ifdef ROUGHNESSMAP
440 uniform sampler2D m_RoughnessMap;
441 #endif
442 #endif
443
444 #ifdef EMISSIVE
445 uniform vec4 m_Emissive;
446 #endif
447 #ifdef EMISSIVEMAP
448 uniform sampler2D m_EmissiveMap;
449 #endif
450 #if defined(EMISSIVE) || defined(EMISSIVEMAP)
451 uniform float m_EmissivePower;
452 uniform float m_EmissiveIntensity;
453 #endif
454
455 #ifdef SPECGLOSSPIPELINE
456
457 uniform vec4 m_Specular;
458 uniform float m_Glossiness;
459 #ifdef USE_PACKED_SG
460 uniform sampler2D m_SpecularGlossinessMap;
461 #else
462 uniform sampler2D m_SpecularMap;
463 uniform sampler2D m_GlossinessMap;
464 #endif
465 #endif
466
467 #ifdef PARALLAXMAP
468 uniform sampler2D m_ParallaxMap;
469 #endif
470 #if (defined(PARALLAXMAP) || (defined(NORMALMAP_PARALLAX) && defined(NORMALMAP)))
471 uniform float m_ParallaxHeight;
472 #endif
473
474 #ifdef LIGHTMAP
475 uniform sampler2D m_LightMap;
476 #endif
477
478 #if defined(NORMALMAP) || defined(PARALLAXMAP)
479 uniform sampler2D m_NormalMap;
480 varying vec4 wTangent;
481 #endif
482 varying vec3 wNormal;
483
484 #ifdef DISCARD_ALPHA
485 uniform float m_AlphaDiscardThreshold;
486 #endif
487
488 void main(){
489 vec2 newTexCoord;
490 vec3 viewDir = normalize(g_CameraPosition - wPosition);
491
492 vec3 norm = normalize(wNormal);
493 #if defined(NORMALMAP) || defined(PARALLAXMAP)
494 vec3 tan = normalize(wTangent.xyz);
495 mat3 tbnMat = mat3(tan, wTangent.w * cross( (norm), (tan)), norm);
496 #endif
497
498 #if (defined(PARALLAXMAP) || (defined(NORMALMAP_PARALLAX) && defined(NORMALMAP)))
499 vec3 vViewDir = viewDir * tbnMat;
500 #ifdef STEEP_PARALLAX
501 #ifdef NORMALMAP_PARALLAX
502 //parallax map is stored in the alpha channel of the normal map
503 newTexCoord = steepParallaxOffset(m_NormalMap, vViewDir, texCoord, m_ParallaxHeight);
504 #else
505 //parallax map is a texture
506 newTexCoord = steepParallaxOffset(m_ParallaxMap, vViewDir, texCoord, m_ParallaxHeight);
507 #endif
508 #else
509 #ifdef NORMALMAP_PARALLAX
510 //parallax map is stored in the alpha channel of the normal map
511 newTexCoord = classicParallaxOffset(m_NormalMap, vViewDir, texCoord, m_ParallaxHeight);
512 #else
513 //parallax map is a texture
514 newTexCoord = classicParallaxOffset(m_ParallaxMap, vViewDir, texCoord, m_ParallaxHeight);
515 #endif
516 #endif
517 #else
518 newTexCoord = texCoord;
519 #endif
520
521 #ifdef BASECOLORMAP
522 vec4 albedo = texture2D(m_BaseColorMap, newTexCoord) * Color;
523 #else
524 vec4 albedo = Color;
525 #endif
526
527 #ifdef USE_PACKED_MR
528 vec2 rm = texture2D(m_MetallicRoughnessMap, newTexCoord).gb;
529 float Roughness = rm.x * max(m_Roughness, 1e-4);
530 float Metallic = rm.y * max(m_Metallic, 0.0);
531 #else
532 #ifdef ROUGHNESSMAP
533 float Roughness = texture2D(m_RoughnessMap, newTexCoord).r * max(m_Roughness, 1e-4);
534 #else
535 float Roughness = max(m_Roughness, 1e-4);
536 #endif
537 #ifdef METALLICMAP
538 float Metallic = texture2D(m_MetallicMap, newTexCoord).r * max(m_Metallic, 0.0);
539 #else
540 float Metallic = max(m_Metallic, 0.0);
541 #endif
542 #endif
543
544 float alpha = albedo.a;
545
546 #ifdef DISCARD_ALPHA
547 if(alpha < m_AlphaDiscardThreshold){
548 discard;
549 }
550 #endif
551
552 // ***********************
553 // Read from textures
554 // ***********************
555 #if defined(NORMALMAP)
556 vec4 normalHeight = texture2D(m_NormalMap, newTexCoord);
557 //Note the -2.0 and -1.0. We invert the green channel of the normal map,
558 //as it's complient with normal maps generated with blender.
559 //see http://hub.jmonkeyengine.org/forum/topic/parallax-mapping-fundamental-bug/#post-256898
560 //for more explanation.
561 vec3 normal = normalize((normalHeight.xyz * vec3(2.0, NORMAL_TYPE * 2.0, 2.0) - vec3(1.0, NORMAL_TYPE * 1.0, 1.0)));
562 normal = normalize(tbnMat * normal);
563 //normal = normalize(normal * inverse(tbnMat));
564 #else
565 vec3 normal = norm;
566 #endif
567
568 #ifdef SPECGLOSSPIPELINE
569
570 #ifdef USE_PACKED_SG
571 vec4 specularColor = texture2D(m_SpecularGlossinessMap, newTexCoord);
572 float glossiness = specularColor.a * m_Glossiness;
573 specularColor *= m_Specular;
574 #else
575 #ifdef SPECULARMAP
576 vec4 specularColor = texture2D(m_SpecularMap, newTexCoord);
577 #else
578 vec4 specularColor = vec4(1.0);
579 #endif
580 #ifdef GLOSSINESSMAP
581 float glossiness = texture2D(m_GlossinessMap, newTexCoord).r * m_Glossiness;
582 #else
583 float glossiness = m_Glossiness;
584 #endif
585 specularColor *= m_Specular;
586 #endif
587 vec4 diffuseColor = albedo;// * (1.0 - max(max(specularColor.r, specularColor.g), specularColor.b));
588 Roughness = 1.0 - glossiness;
589 vec3 fZero = specularColor.xyz;
590 #else
591 float specular = 0.5;
592 float nonMetalSpec = 0.08 * specular;
593 vec4 specularColor = (nonMetalSpec - nonMetalSpec * Metallic) + albedo * Metallic;
594 vec4 diffuseColor = albedo - albedo * Metallic;
595 vec3 fZero = vec3(specular);
596 #endif
597
598 gl_FragColor.rgb = vec3(0.0);
599 vec3 ao = vec3(1.0);
600
601 #ifdef LIGHTMAP
602 vec3 lightMapColor;
603 #ifdef SEPARATE_TEXCOORD
604 lightMapColor = texture2D(m_LightMap, texCoord2).rgb;
605 #else
606 lightMapColor = texture2D(m_LightMap, texCoord).rgb;
607 #endif
608 #ifdef AO_MAP
609 lightMapColor.gb = lightMapColor.rr;
610 ao = lightMapColor;
611 #else
612 gl_FragColor.rgb += diffuseColor.rgb * lightMapColor;
613 #endif
614 specularColor.rgb *= lightMapColor;
615 #endif
616
617
618 float ndotv = max( dot( normal, viewDir ),0.0);
619 for( int i = 0;i < NB_LIGHTS; i+=3){
620 vec4 lightColor = g_LightData[i];
621 vec4 lightData1 = g_LightData[i+1];
622 vec4 lightDir;
623 vec3 lightVec;
624 lightComputeDir(wPosition, lightColor.w, lightData1, lightDir, lightVec);
625
626 float fallOff = 1.0;
627 #if __VERSION__ >= 110
628 // allow use of control flow
629 if(lightColor.w > 1.0){
630 #endif
631 fallOff = computeSpotFalloff(g_LightData[i+2], lightVec);
632 #if __VERSION__ >= 110
633 }
634 #endif
635 //point light attenuation
636 fallOff *= lightDir.w;
637
638 lightDir.xyz = normalize(lightDir.xyz);
639 vec3 directDiffuse;
640 vec3 directSpecular;
641
642 float hdotv = PBR_ComputeDirectLight(normal, lightDir.xyz, viewDir,
643 lightColor.rgb, fZero, Roughness, ndotv,
644 directDiffuse, directSpecular);
645
646 vec3 directLighting = diffuseColor.rgb *directDiffuse + directSpecular;
647
648 gl_FragColor.rgb += directLighting * fallOff;
649 }
650
651 #if NB_PROBES >= 1
652 vec3 color1 = vec3(0.0);
653 vec3 color2 = vec3(0.0);
654 vec3 color3 = vec3(0.0);
655 float weight1 = 1.0;
656 float weight2 = 0.0;
657 float weight3 = 0.0;
658
659 float ndf = renderProbe(viewDir, wPosition, normal, norm, Roughness, diffuseColor, specularColor, ndotv, ao, g_LightProbeData, g_ShCoeffs, g_PrefEnvMap, color1);
660 #if NB_PROBES >= 2
661 float ndf2 = renderProbe(viewDir, wPosition, normal, norm, Roughness, diffuseColor, specularColor, ndotv, ao, g_LightProbeData2, g_ShCoeffs2, g_PrefEnvMap2, color2);
662 #endif
663 #if NB_PROBES == 3
664 float ndf3 = renderProbe(viewDir, wPosition, normal, norm, Roughness, diffuseColor, specularColor, ndotv, ao, g_LightProbeData3, g_ShCoeffs3, g_PrefEnvMap3, color3);
665 #endif
666
667 #if NB_PROBES >= 2
668 float invNdf = max(1.0 - ndf,0.0);
669 float invNdf2 = max(1.0 - ndf2,0.0);
670 float sumNdf = ndf + ndf2;
671 float sumInvNdf = invNdf + invNdf2;
672 #if NB_PROBES == 3
673 float invNdf3 = max(1.0 - ndf3,0.0);
674 sumNdf += ndf3;
675 sumInvNdf += invNdf3;
676 weight3 = ((1.0 - (ndf3 / sumNdf)) / (NB_PROBES - 1)) * (invNdf3 / sumInvNdf);
677 #endif
678
679 weight1 = ((1.0 - (ndf / sumNdf)) / (NB_PROBES - 1)) * (invNdf / sumInvNdf);
680 weight2 = ((1.0 - (ndf2 / sumNdf)) / (NB_PROBES - 1)) * (invNdf2 / sumInvNdf);
681
682 float weightSum = weight1 + weight2 + weight3;
683
684 weight1 /= weightSum;
685 weight2 /= weightSum;
686 weight3 /= weightSum;
687 #endif
688
689 #ifdef USE_AMBIENT_LIGHT
690 color1.rgb *= g_AmbientLightColor.rgb;
691 color2.rgb *= g_AmbientLightColor.rgb;
692 color3.rgb *= g_AmbientLightColor.rgb;
693 #endif
694 gl_FragColor.rgb += color1 * clamp(weight1,0.0,1.0) + color2 * clamp(weight2,0.0,1.0) + color3 * clamp(weight3,0.0,1.0);
695
696 #endif
697
698 #if defined(EMISSIVE) || defined (EMISSIVEMAP)
699 #ifdef EMISSIVEMAP
700 vec4 emissive = texture2D(m_EmissiveMap, newTexCoord);
701 #else
702 vec4 emissive = m_Emissive;
703 #endif
704 gl_FragColor += emissive * pow(emissive.a, m_EmissivePower) * m_EmissiveIntensity;
705 #endif
706 gl_FragColor.a = alpha;
707
708 }
2020-04-01 10:40:03,002 WARN [jME3 Main] com.jme3.anim.SkinningControl (SkinningControl.java:178) - Could not enable HW skinning due to shader compile error:
com.jme3.renderer.RendererException: compile error in: ShaderSource[name=Common/MatDefs/Light/PBRLighting.frag, defines, type=Fragment, language=GLSL150]
WARNING: 0:10: extension 'GL_ARB_shader_texture_lod' is not supported
ERROR: 0:206: '' : syntax error: incorrect preprocessor directive
ERROR: 0:206: '' : syntax error: unexpected tokens following #if preprocessor directive - expected a newline
ERROR: 0:238: '' : syntax error: incorrect preprocessor directive
ERROR: 0:238: '' : syntax error: unexpected tokens following #if preprocessor directive - expected a newline
ERROR: 0:413: '' : syntax error: incorrect preprocessor directive
ERROR: 0:413: '' : syntax error: unexpected tokens following #if preprocessor directive - expected a newline
ERROR: 0:418: '' : syntax error: incorrect preprocessor directive
ERROR: 0:418: '' : syntax error: unexpected tokens following #if preprocessor directive - expected a newline
ERROR: 0:423: '' : syntax error: incorrect preprocessor directive
ERROR: 0:423: '' : syntax error: unexpected tokens following #if preprocessor directive - expected a newline
ERROR: 0:651: '' : syntax error: incorrect preprocessor directive
ERROR: 0:651: '' : syntax error: unexpected tokens following #if preprocessor directive - expected a newline
ERROR: 0:660: '' : syntax error: incorrect preprocessor directive
ERROR: 0:660: '' : syntax error: unexpected tokens following #if preprocessor directive - expected a newline
ERROR: 0:663: '' : syntax error: incorrect preprocessor directive
ERROR: 0:663: '' : syntax error: unexpected tokens following #if preprocessor directive - expected a newline
ERROR: 0:667: '' : syntax error: incorrect preprocessor directive
ERROR: 0:667: '' : syntax error: unexpected tokens following #if preprocessor directive - expected a newline
ERROR: 0:672: '' : syntax error: incorrect preprocessor directive
ERROR: 0:672: '' : syntax error: unexpected tokens following #if preprocessor directive - expected a newlineMetadata
Metadata
Assignees
Labels
No labels