View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0033074 | Open CASCADE | OCCT:Visualization | public | 2022-07-22 10:52 | 2023-03-19 20:44 |
| Reporter | kgv | Assigned To | |||
| Priority | normal | Severity | minor | ||
| Status | closed | Resolution | fixed | ||
| Platform | Linux | OS | Ubuntu 20.04 | ||
| Product Version | 7.5.0 | ||||
| Target Version | 7.6.3 | Fixed in Version | 7.7.0 | ||
| Summary | 0033074: Visualization, TKOpenGl - PBR shader compilation error on Mesa OpenGL 3.1 | ||||
| Description | PBR initialization fails on Mesa OpenGL 3.1 implementation.
TKOpenGl | Type: Error | ID: 0 | Severity: High | Message:
1: #version 120
2: // Enable extensions used in OCCT GLSL programs
3: #extension GL_ARB_sample_shading : enable
4: #define FRAGMENT_SHADER
5: #define THE_MAX_LIGHTS 0
6: #define THE_MAX_CLIP_PLANES 0
7: #define THE_NB_FRAG_OUTPUTS 1
8: #define THE_IS_PBR
9:
10: //! @file Declarations.glsl includes definition of common uniform variables in OCCT GLSL programs
11: //! @def THE_MAX_LIGHTS
12: //! Specifies the length of array of lights, which is 8 by default. Defined by Shader Manager.
13: // #define THE_MAX_LIGHTS 8
14:
15: //! @def THE_MAX_CLIP_PLANES
16: //! Specifies the length of array of clipping planes, which is 8 by default. Defined by Shader Manager.
17: // #define THE_MAX_CLIP_PLANES 8
18:
19: //! @def THE_NB_FRAG_OUTPUTS
20: //! Specifies the length of array of Fragment Shader outputs, which is 1 by default. Defined by Shader Manager.
21: // #define THE_NB_FRAG_OUTPUTS 1
22:
23: // compatibility macros
24: #if (__VERSION__ >= 130)
25: #define THE_ATTRIBUTE in
26: #define THE_SHADER_IN in
27: #define THE_SHADER_OUT out
28: #define THE_OUT out
29: #define occTexture1D texture
30: #define occTexture2D texture
31: #define occTexture3D texture
32: #define occTextureCube texture
33: #define occTextureCubeLod textureLod
34: #else
35: #define THE_ATTRIBUTE attribute
36: #define THE_SHADER_IN varying
37: #define THE_SHADER_OUT varying
38: #define THE_OUT
39: #define occTexture1D texture1D
40: #define occTexture2D texture2D
41: #define occTexture3D texture3D
42: #define occTextureCube textureCube
43: #if !defined(GL_ES) || defined(textureCubeLod)
44: #define occTextureCubeLod textureCubeLod
45: #else // fallback
46: #define occTextureCubeLod(theSampl,theCoord,theLod) textureCube(theSampl,theCoord)
47: #endif
48: #endif
49:
50: #ifdef GL_ES
51: #if (__VERSION__ >= 300)
52: #define THE_PREC_ENUM highp // lowp should be enough for enums but triggers driver bugs
53: #else
54: #define THE_PREC_ENUM lowp
55: #endif
56: #else
57: #define THE_PREC_ENUM
58: #endif
59:
60: // Vertex attributes
61: #ifdef VERTEX_SHADER
62: THE_ATTRIBUTE vec4 occVertex;
63: THE_ATTRIBUTE vec3 occNormal;
64: THE_ATTRIBUTE vec4 occTexCoord;
65: THE_ATTRIBUTE vec4 occVertColor;
66: #elif defined(FRAGMENT_SHADER)
67: #if (__VERSION__ >= 130)
68: #ifdef OCC_ENABLE_draw_buffers
69: out vec4 occFragColorArray[THE_NB_FRAG_OUTPUTS];
70: #define occFragColorArrayAlias occFragColorArray
71: #define occFragColor0 occFragColorArray[0]
72: #else
73: out vec4 occFragColor0;
74: #endif
75: #else
76: #ifdef OCC_ENABLE_draw_buffers
77: #define occFragColorArrayAlias gl_FragData
78: #define occFragColor0 gl_FragData[0]
79: #else
80: #define occFragColor0 gl_FragColor
81: #endif
82: #endif
83:
84: #if (THE_NB_FRAG_OUTPUTS >= 2)
85: #define occFragColor1 occFragColorArrayAlias[1]
86: #else
87: vec4 occFragColor1;
88: #endif
89: #if (THE_NB_FRAG_OUTPUTS >= 3)
90: #define occFragColor2 occFragColorArrayAlias[2]
91: #else
92: vec4 occFragColor2;
93: #endif
94: #if (THE_NB_FRAG_OUTPUTS >= 4)
95: #define occFragColor3 occFragColorArrayAlias[3]
96: #else
97: vec4 occFragColor3;
98: #endif
99:
100: // Built-in outputs notation
101: #define occFragColor occFragColor0
102: #define occFragCoverage occFragColor1
103:
104: #define occPeelDepth occFragColor0
105: #define occPeelFrontColor occFragColor1
106: #define occPeelBackColor occFragColor2
107:
108: //! Define the main Fragment Shader early return procedure.
109: bool occFragEarlyReturn();
110:
111: //! Define the main Fragment Shader output - color value.
112: void occSetFragColor (in vec4 theColor);
113: #endif
114:
115: // Pi number definitions
116: #define PI 3.141592654
117: #define PI_2 6.283185307
118: #define PI_DIV_2 1.570796327
119: #define PI_DIV_3 1.047197551
120: #define PI_DIV_4 0.785398163
121: #define INV_PI 0.318309886
122: #define INV_PI_2 0.159154943
123:
124: // Matrix state
125: uniform mat4 occWorldViewMatrix; //!< World-view matrix
126: uniform mat4 occProjectionMatrix; //!< Projection matrix
127: uniform mat4 occModelWorldMatrix; //!< Model-world matrix
128:
129: uniform mat4 occWorldViewMatrixInverse; //!< Inverse of the world-view matrix
130: uniform mat4 occProjectionMatrixInverse; //!< Inverse of the projection matrix
131: uniform mat4 occModelWorldMatrixInverse; //!< Inverse of the model-world matrix
132:
133: uniform mat4 occWorldViewMatrixTranspose; //!< Transpose of the world-view matrix
134: uniform mat4 occProjectionMatrixTranspose; //!< Transpose of the projection matrix
135: uniform mat4 occModelWorldMatrixTranspose; //!< Transpose of the model-world matrix
136:
137: uniform mat4 occWorldViewMatrixInverseTranspose; //!< Transpose of the inverse of the world-view matrix
138: uniform mat4 occProjectionMatrixInverseTranspose; //!< Transpose of the inverse of the projection matrix
139: uniform mat4 occModelWorldMatrixInverseTranspose; //!< Transpose of the inverse of the model-world matrix
140:
141: #if defined(THE_IS_PBR)
142: uniform sampler2D occEnvLUT; //!< Environment Lookup Table
143: uniform sampler2D occDiffIBLMapSHCoeffs; //!< Packed diffuse (irradiance) IBL map's spherical harmonics coefficients
144: uniform samplerCube occSpecIBLMap; //!< Specular IBL map
145: uniform int occNbSpecIBLLevels; //!< Number of mipmap levels used in occSpecIBLMap to store different roughness values maps
146:
147: vec3 occDiffIBLMap (in vec3 theNormal); //!< Unpacks spherical harmonics coefficients to diffuse IBL map's values
148: #endif
149:
150: // light type enumeration (same as Graphic3d_TypeOfLightSource)
151: const int OccLightType_Direct = 1; //!< directional light source
152: const int OccLightType_Point = 2; //!< isotropic point light source
153: const int OccLightType_Spot = 3; //!< spot light source
154:
155: // Light sources
156: uniform vec4 occLightAmbient; //!< Cumulative ambient color
157: #if defined(THE_MAX_LIGHTS) && (THE_MAX_LIGHTS > 0)
158: #if (THE_MAX_LIGHTS > 1)
159: #define occLight_Index(theId) theId
160: #else
161: #define occLight_Index(theId) 0
162: #endif
163: uniform THE_PREC_ENUM int occLightSourcesCount; //!< Total number of light sources
164:
165: //! Type of light source, int (see OccLightType enum).
166: #define occLight_Type(theId) occLightSourcesTypes[occLight_Index(theId)]
167:
168: //! Specular intensity (equals to diffuse), vec3.
169: #define occLight_Specular(theId) occLightSources[occLight_Index(theId) * 4 + 0].rgb
170:
171: //! Intensity of light source (>= 0), float.
172: #define occLight_Intensity(theId) occLightSources[occLight_Index(theId) * 4 + 0].a
173:
174: //! Is light a headlight, bool? DEPRECATED method.
175: #define occLight_IsHeadlight(theId) false
176:
177: //! Position of specified light source or direction of directional light source, vec3.
178: #define occLight_Position(theId) occLightSources[occLight_Index(theId) * 4 + 1].xyz
179:
180: //! Direction of specified spot light source, vec3.
181: #define occLight_SpotDirection(theId) occLightSources[occLight_Index(theId) * 4 + 2].xyz
182:
183: //! Range on which point light source (positional or spot) can affect (>= 0), float.
184: #define occLight_Range(theId) occLightSources[occLight_Index(theId) * 4 + 2].w
185:
186: //! Maximum spread angle of the spot light (in radians), float.
187: #define occLight_SpotCutOff(theId) occLightSources[occLight_Index(theId) * 4 + 3].z
188:
189: //! Attenuation of the spot light intensity (from 0 to 1), float.
190: #define occLight_SpotExponent(theId) occLightSources[occLight_Index(theId) * 4 + 3].w
191:
192: #if !defined(THE_IS_PBR)
193: //! Diffuse intensity (equals to Specular), vec3.
194: #define occLight_Diffuse(theId) occLightSources[occLight_Index(theId) * 4 + 0].rgb
195:
196: //! Const attenuation factor of positional light source, float.
197: #define occLight_ConstAttenuation(theId) occLightSources[occLight_Index(theId) * 4 + 3].x
198:
199: //! Linear attenuation factor of positional light source, float.
200: #define occLight_LinearAttenuation(theId) occLightSources[occLight_Index(theId) * 4 + 3].y
201: #endif
202: #endif
203:
204: #if defined(THE_IS_PBR)
205: //! Converts roughness value from range [0, 1] to real value for calculations
206: float occRoughness (in float theNormalizedRoughness);
207:
208: // Front/back material properties accessors
209: vec4 occPBRMaterial_Color(in bool theIsFront); //!< Base color of PBR material
210: float occPBRMaterial_Metallic(in bool theIsFront); //!< Metallic coefficient
211: float occPBRMaterial_NormalizedRoughness(in bool theIsFront); //!< Normalized roughness coefficient
212: vec3 occPBRMaterial_Emission(in bool theIsFront); //!< Light intensity emitted by material
213: float occPBRMaterial_IOR(in bool theIsFront); //!< Index of refraction
214: #define occMaterial_Emission occPBRMaterial_Emission
215: #define occMaterial_Color occPBRMaterial_Color
216: #else
217: vec4 occMaterial_Diffuse(in bool theIsFront); //!< Diffuse reflection
218: vec3 occMaterial_Specular(in bool theIsFront); //!< Specular reflection
219: float occMaterial_Shininess(in bool theIsFront); //!< Specular exponent
220: vec3 occMaterial_Ambient(in bool theIsFront); //!< Ambient reflection
221: vec3 occMaterial_Emission(in bool theIsFront); //!< Emission color
222: #define occMaterial_Color occMaterial_Diffuse
223: #endif
224:
225: #ifdef THE_HAS_DEFAULT_SAMPLER
226: #define occActiveSampler occSampler0 //!< alias for backward compatibility
227: #define occSamplerBaseColor occSampler0 //!< alias to a base color texture
228: uniform sampler2D occSampler0; //!< current active sampler;
229: #endif //! occSampler1, occSampler2,... should be defined in GLSL program body for multitexturing
230:
231: #if defined(THE_HAS_TEXTURE_COLOR) && defined(FRAGMENT_SHADER)
232: #define occMaterialBaseColor(theIsFront, theTexCoord) (occMaterial_Color(theIsFront) * occTexture2D(occSamplerBaseColor, theTexCoord))
233: #else
234: #define occMaterialBaseColor(theIsFront, theTexCoord) occMaterial_Color(theIsFront)
235: #endif
236:
237: #if defined(THE_HAS_TEXTURE_OCCLUSION) && defined(FRAGMENT_SHADER)
238: uniform sampler2D occSamplerOcclusion; //!< R occlusion texture sampler
239: #define occMaterialOcclusion(theColor, theTexCoord) theColor *= occTexture2D(occSamplerOcclusion, theTexCoord).r;
240: #else
241: #define occMaterialOcclusion(theColor, theTexCoord)
242: #endif
243:
244: #if defined(THE_HAS_TEXTURE_EMISSIVE) && defined(FRAGMENT_SHADER)
245: uniform sampler2D occSamplerEmissive; //!< RGB emissive texture sampler
246: #define occMaterialEmission(theIsFront, theTexCoord) (occMaterial_Emission(theIsFront) * occTexture2D(occSamplerEmissive, theTexCoord).rgb)
247: #else
248: #define occMaterialEmission(theIsFront, theTexCoord) occMaterial_Emission(theIsFront)
249: #endif
250:
251: #if defined(THE_HAS_TEXTURE_NORMAL) && defined(FRAGMENT_SHADER)
252: uniform sampler2D occSamplerNormal; //!< XYZ normal texture sampler with W==0 indicating no texture
253: #define occTextureNormal(theTexCoord) occTexture2D(occSamplerNormal, theTexCoord)
254: #else
255: #define occTextureNormal(theTexCoord) vec4(0.0) // no normal map
256: #endif
257:
258: #if defined(THE_HAS_TEXTURE_METALROUGHNESS) && defined(FRAGMENT_SHADER)
259: uniform sampler2D occSamplerMetallicRoughness; //!< BG metallic-roughness texture sampler
260: #define occMaterialRoughness(theIsFront, theTexCoord) (occPBRMaterial_NormalizedRoughness(theIsFront) * occTexture2D(occSamplerMetallicRoughness, theTexCoord).g)
261: #define occMaterialMetallic(theIsFront, theTexCoord) (occPBRMaterial_Metallic(theIsFront) * occTexture2D(occSamplerMetallicRoughness, theTexCoord).b)
262: #else
263: #define occMaterialRoughness(theIsFront, theTexCoord) occPBRMaterial_NormalizedRoughness(theIsFront)
264: #define occMaterialMetallic(theIsFront, theTexCoord) occPBRMaterial_Metallic(theIsFront)
265: #endif
266:
267: uniform vec4 occColor; //!< color value (in case of disabled lighting)
268: uniform THE_PREC_ENUM int occDistinguishingMode; //!< Are front and back faces distinguished?
269: uniform THE_PREC_ENUM int occTextureEnable; //!< Is texture enabled?
270: uniform vec4 occTexTrsf2d[2]; //!< 2D texture transformation parameters
271: uniform float occPointSize; //!< point size
272:
273: //! Parameters of blended order-independent transparency rendering algorithm
274: uniform int occOitOutput; //!< Enable bit for writing output color buffers for OIT (occFragColor, occFragCoverage)
275: uniform float occOitDepthFactor; //!< Influence of the depth component to the coverage of the accumulated fragment
276: uniform float occAlphaCutoff; //!< alpha test cutoff value
277:
278: //! Parameters of clipping planes
279: #if defined(THE_MAX_CLIP_PLANES) && (THE_MAX_CLIP_PLANES > 0)
280: uniform vec4 occClipPlaneEquations[THE_MAX_CLIP_PLANES];
281: uniform THE_PREC_ENUM int occClipPlaneChains[THE_MAX_CLIP_PLANES]; //! Indicating the number of planes in the Chain
282: uniform THE_PREC_ENUM int occClipPlaneCount; //!< Total number of clip planes
283: #endif
284: //! @endfile Declarations.glsl
285:
286: //! @file DeclarationsImpl.glsl includes implementation of common functions and properties accessors
287: #if defined(FRAGMENT_SHADER)
288:
289: #if defined(OCC_DEPTH_PEEL_OIT)
290: uniform sampler2D occDepthPeelingDepth;
291: uniform sampler2D occDepthPeelingFrontColor;
292: int IsFrontPeelLayer = -1;
293: bool occFragEarlyReturn()
294: {
295: #define THE_DEPTH_CLEAR_VALUE -1e15f
296: ivec2 aFragCoord = ivec2 (gl_FragCoord.xy);
297: vec2 aLastDepth = texelFetch (occDepthPeelingDepth, aFragCoord, 0).rg;
298: occPeelFrontColor = texelFetch (occDepthPeelingFrontColor, aFragCoord, 0);
299: occPeelDepth.rg = vec2 (THE_DEPTH_CLEAR_VALUE); // depth value always increases, so that MAX blend equation can be used
300: occPeelBackColor = vec4 (0.0); // back color is blend after each peeling pass
301:
302: float aNearDepth = -aLastDepth.x;
303: float aFarDepth = aLastDepth.y;
304: float aFragDepth = gl_FragCoord.z; // 0 - 1
305: if (aFragDepth < aNearDepth || aFragDepth > aFarDepth)
306: {
307: return true; // skip peeled depth
308: }
309: else if (aFragDepth > aNearDepth && aFragDepth < aFarDepth)
310: {
311: // to be rendered at next peeling pass
312: occPeelDepth.rg = vec2 (-aFragDepth, aFragDepth);
313: return true;
314: }
315:
316: IsFrontPeelLayer = (gl_FragCoord.z == aNearDepth) ? 1 : 0;
317: return false;
318: }
319: #else
320: bool occFragEarlyReturn() { return false; }
321: #endif
322:
323: void occSetFragColor (in vec4 theColor)
324: {
325: #if defined(OCC_ALPHA_TEST)
326: if (theColor.a < occAlphaCutoff) discard;
327: #endif
328: #if defined(OCC_WRITE_WEIGHT_OIT_COVERAGE)
329: float aWeight = theColor.a * clamp (1e+2 * pow (1.0 - gl_FragCoord.z * occOitDepthFactor, 3.0), 1e-2, 1e+2);
330: occFragCoverage.r = theColor.a * aWeight;
331: occFragColor = vec4 (theColor.rgb * theColor.a * aWeight, theColor.a);
332: #elif defined(OCC_DEPTH_PEEL_OIT)
333: if (IsFrontPeelLayer == 1) // front is blended directly
334: {
335: vec4 aLastColor = occPeelFrontColor;
336: float anAlphaMult = 1.0 - aLastColor.a;
337: occPeelFrontColor.rgb = aLastColor.rgb + theColor.rgb * theColor.a * anAlphaMult;
338: occPeelFrontColor.a = 1.0 - anAlphaMult * (1.0 - theColor.a);
339: }
340: else if (IsFrontPeelLayer == 0) // back is blended afterwards
341: {
342: occPeelBackColor = theColor;
343: }
344: #else
345: occFragColor = theColor;
346: #endif
347: }
348: #endif
349:
350: #if defined(THE_MAX_LIGHTS) && (THE_MAX_LIGHTS > 0)
351: // arrays of light sources
352: uniform vec4 occLightSources[THE_MAX_LIGHTS * 4]; //!< packed light sources parameters
353: uniform THE_PREC_ENUM int occLightSourcesTypes[THE_MAX_LIGHTS]; //!< packed light sources types
354: #endif
355:
356: #if defined(THE_IS_PBR)
357: vec3 occDiffIBLMap (in vec3 theNormal)
358: {
359: vec3 aSHCoeffs[9];
360: for (int i = 0; i < 9; ++i)
361: {
362: aSHCoeffs[i] = occTexture2D (occDiffIBLMapSHCoeffs, vec2 ((float(i) + 0.5) / 9.0, 0.0)).rgb;
363: }
364: return aSHCoeffs[0]
365:
366: + aSHCoeffs[1] * theNormal.x
367: + aSHCoeffs[2] * theNormal.y
368: + aSHCoeffs[3] * theNormal.z
369:
370: + aSHCoeffs[4] * theNormal.x * theNormal.z
371: + aSHCoeffs[5] * theNormal.y * theNormal.z
372: + aSHCoeffs[6] * theNormal.x * theNormal.y
373:
374: + aSHCoeffs[7] * (3.0 * theNormal.z * theNormal.z - 1.0)
375: + aSHCoeffs[8] * (theNormal.x * theNormal.x - theNormal.y * theNormal.y);
376: }
377: #endif
378:
379: // front and back material properties accessors
380: #if defined(THE_IS_PBR)
381: uniform vec4 occPbrMaterial[3 * 2];
382:
383: #define MIN_ROUGHNESS 0.01
384: float occRoughness (in float theNormalizedRoughness) { return theNormalizedRoughness * (1.0 - MIN_ROUGHNESS) + MIN_ROUGHNESS; }
385: vec4 occPBRMaterial_Color(in bool theIsFront) { return theIsFront ? occPbrMaterial[0] : occPbrMaterial[3]; }
386: vec3 occPBRMaterial_Emission(in bool theIsFront) { return theIsFront ? occPbrMaterial[1].rgb : occPbrMaterial[4].rgb; }
387: float occPBRMaterial_IOR(in bool theIsFront) { return theIsFront ? occPbrMaterial[1].w : occPbrMaterial[4].w; }
388: float occPBRMaterial_Metallic(in bool theIsFront) { return theIsFront ? occPbrMaterial[2].b : occPbrMaterial[5].b; }
389: float occPBRMaterial_NormalizedRoughness(in bool theIsFront) { return theIsFront ? occPbrMaterial[2].g : occPbrMaterial[5].g; }
390: #else
391: uniform vec4 occCommonMaterial[4 * 2];
392:
393: vec4 occMaterial_Diffuse(in bool theIsFront) { return theIsFront ? occCommonMaterial[0] : occCommonMaterial[4]; }
394: vec3 occMaterial_Emission(in bool theIsFront) { return theIsFront ? occCommonMaterial[1].rgb : occCommonMaterial[5].rgb; }
395: vec3 occMaterial_Specular(in bool theIsFront) { return theIsFront ? occCommonMaterial[2].rgb : occCommonMaterial[6].rgb; }
396: float occMaterial_Shininess(in bool theIsFront) { return theIsFront ? occCommonMaterial[2].a : occCommonMaterial[6].a; }
397: vec3 occMaterial_Ambient(in bool theIsFront) { return theIsFront ? occCommonMaterial[3].rgb : occCommonMaterial[7].rgb; }
398: #endif
399:
400: // 2D texture coordinates transformation
401: vec2 occTextureTrsf_Translation(void) { return occTexTrsf2d[0].xy; }
402: vec2 occTextureTrsf_Scale(void) { return occTexTrsf2d[0].zw; }
403: float occTextureTrsf_RotationSin(void) { return occTexTrsf2d[1].x; }
404: float occTextureTrsf_RotationCos(void) { return occTexTrsf2d[1].y; }
405: //! @endfile DeclarationsImpl.glsl
406:
407: vec3 cubemapVectorTransform (in vec3 theVector,
408: in int theYCoeff,
409: in int theZCoeff)
410: {
411: theVector = theVector.yzx;
412: theVector.y *= float(theYCoeff);
413: theVector.z *= float(theZCoeff);
414: return theVector;
415: }//! Calculates micro facet normals distribution.
416: float occPBRDistribution (in float theCosH,
417: in float theRoughness)
418: {
419: float aDistribution = theRoughness * theRoughness;
420: aDistribution = aDistribution / (theCosH * theCosH * (aDistribution * aDistribution - 1.0) + 1.0);
421: aDistribution = INV_PI * aDistribution * aDistribution;
422: return aDistribution;
423: }
424:
425: #define THE_TO_BAKE_SPECULAR
426: THE_SHADER_IN vec3 ViewDirection; //!< direction of fetching from environment cubemap
427:
428: #if (__VERSION__ >= 120)
429: uniform int uSamplesNum; //!< number of samples in Monte-Carlo integration
430: #else
431: const int uSamplesNum = 256;
432: #endif
433: uniform samplerCube uEnvMap; //!< source of baking (environment cubemap)
434:
435: #ifdef THE_TO_BAKE_DIFFUSE
436: uniform int uYCoeff; //!< coefficient of Y controlling horizontal flip of cubemap
437: uniform int uZCoeff; //!< coefficient of Z controlling vertical flip of cubemap
438: #endif
439:
440: #ifdef THE_TO_BAKE_SPECULAR
441: uniform int uCurrentLevel; //!< current level of specular IBL map (ignored in case of diffuse map's processing)
442: uniform float uEnvSolidAngleSource; //!< source solid angle sample computed from one edge's size of source environment map's zero mipmap level
443: #endif
444:
445: //! Returns coordinates of point theNumber from Hammersley point set having size theSize.
446: vec2 hammersley (in int theNumber,
447: in int theSize)
448: {
449: int aDenominator = 2;
450: int aNumber = theNumber;
451: float aVanDerCorput = 0.0;
452: for (int i = 0; i < 32; ++i)
453: {
454: if (aNumber > 0)
455: {
456: aVanDerCorput += mod(float(aNumber), 2.0) / float(aDenominator);
457: aNumber /= 2;
458: aDenominator *= 2;
459: }
460: }
461: return vec2(float(theNumber) / float(theSize), aVanDerCorput);
462: }
463:
464: //! This function does importance sampling on hemisphere surface using GGX normal distribution function
465: //! in tangent space (positive z axis is surface normal direction).
466: vec3 importanceSample (in vec2 theHammersleyPoint,
467: in float theRoughness)
468: {
469: float aPhi = PI_2 * theHammersleyPoint.x;
470: theRoughness *= theRoughness;
471: theRoughness *= theRoughness;
472: float aCosTheta = sqrt((1.0 - theHammersleyPoint.y) / (1.0 + (theRoughness - 1.0) * theHammersleyPoint.y));
473: float aSinTheta = sqrt(1.0 - aCosTheta * aCosTheta);
474: return vec3(aSinTheta * cos(aPhi),
475: aSinTheta * sin(aPhi),
476: aCosTheta);
477: }
478:
479: //! This function uniformly generates samples on whole sphere.
480: vec3 sphereUniformSample (in vec2 theHammersleyPoint)
481: {
482: float aPhi = PI_2 * theHammersleyPoint.x;
483: float aCosTheta = 2.0 * theHammersleyPoint.y - 1.0;
484: float aSinTheta = sqrt(1.0 - aCosTheta * aCosTheta);
485: return vec3(aSinTheta * cos(aPhi),
486: aSinTheta * sin(aPhi),
487: aCosTheta);
488: }
489:
490: //! Transforms resulted sampled direction from tangent space to world space considering the surface normal.
491: vec3 fromTangentSpace (in vec3 theVector,
492: in vec3 theNormal)
493: {
494: vec3 anUp = (abs(theNormal.z) < 0.999) ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);
495: vec3 anX = normalize(cross(anUp, theNormal));
496: vec3 anY = cross(theNormal, anX);
497: return anX * theVector.x + anY * theVector.y + theNormal * theVector.z;
498: }
499:
500: #ifdef THE_TO_BAKE_DIFFUSE
501: #if (__VERSION__ >= 120)
502: const float aSHBasisFuncCoeffs[9] = float[9]
503: (
504: 0.282095 * 0.282095,
505: 0.488603 * 0.488603,
506: 0.488603 * 0.488603,
507: 0.488603 * 0.488603,
508: 1.092548 * 1.092548,
509: 1.092548 * 1.092548,
510: 1.092548 * 1.092548,
511: 0.315392 * 0.315392,
512: 0.546274 * 0.546274
513: );
514: const float aSHCosCoeffs[9] = float[9]
515: (
516: 3.141593,
517: 2.094395,
518: 2.094395,
519: 2.094395,
520: 0.785398,
521: 0.785398,
522: 0.785398,
523: 0.785398,
524: 0.785398
525: );
526: #else
527: uniform float aSHBasisFuncCoeffs[9];
528: uniform float aSHCosCoeffs[9];
529: #endif
530:
531: //! Bakes diffuse IBL map's spherical harmonics coefficients.
532: vec3 bakeDiffuseSH()
533: {
534: int anId = int(gl_FragCoord.x);
535: float aCoef;
536: #if (__VERSION__ >= 120)
537: aCoef = aSHCosCoeffs[anId] * aSHBasisFuncCoeffs[anId];
538: #else
539: if (anId == 0) { aCoef = aSHCosCoeffs[0] * aSHBasisFuncCoeffs[0]; }
540: else if (anId == 1) { aCoef = aSHCosCoeffs[1] * aSHBasisFuncCoeffs[1]; }
541: else if (anId == 2) { aCoef = aSHCosCoeffs[2] * aSHBasisFuncCoeffs[2]; }
542: else if (anId == 3) { aCoef = aSHCosCoeffs[3] * aSHBasisFuncCoeffs[3]; }
543: else if (anId == 4) { aCoef = aSHCosCoeffs[4] * aSHBasisFuncCoeffs[4]; }
544: else if (anId == 5) { aCoef = aSHCosCoeffs[5] * aSHBasisFuncCoeffs[5]; }
545: else if (anId == 6) { aCoef = aSHCosCoeffs[6] * aSHBasisFuncCoeffs[6]; }
546: else if (anId == 7) { aCoef = aSHCosCoeffs[7] * aSHBasisFuncCoeffs[7]; }
547: else { aCoef = aSHCosCoeffs[8] * aSHBasisFuncCoeffs[8]; }
548: #endif
549: vec3 aRes = vec3 (0.0);
550: for (int aSampleIter = 0; aSampleIter < uSamplesNum; ++aSampleIter)
551: {
552: vec2 aHammersleyPoint = hammersley (aSampleIter, uSamplesNum);
553: vec3 aDir = sphereUniformSample (aHammersleyPoint);
554:
555: vec3 aVal = occTextureCube (uEnvMap, cubemapVectorTransform (aDir, uYCoeff, uZCoeff)).rgb;
556: #if (__VERSION__ >= 120)
557: float aFunc[9];
558: aFunc[0] = 1.0;
559:
560: aFunc[1] = aDir.x;
561: aFunc[2] = aDir.y;
562: aFunc[3] = aDir.z;
563:
564: aFunc[4] = aDir.x * aDir.z;
565: aFunc[5] = aDir.y * aDir.z;
566: aFunc[6] = aDir.x * aDir.y;
567:
568: aFunc[7] = 3.0 * aDir.z * aDir.z - 1.0;
569: aFunc[8] = aDir.x * aDir.x - aDir.y * aDir.y;
570:
571: aRes += aVal * aFunc[anId];
572: #else
573: if (anId == 0) { aRes += aVal * 1.0; }
574: else if (anId == 1) { aRes += aVal * aDir.x; }
575: else if (anId == 2) { aRes += aVal * aDir.y; }
576: else if (anId == 3) { aRes += aVal * aDir.z; }
577: else if (anId == 4) { aRes += aVal * (aDir.x * aDir.z); }
578: else if (anId == 5) { aRes += aVal * (aDir.y * aDir.z); }
579: else if (anId == 6) { aRes += aVal * (aDir.x * aDir.y); }
580: else if (anId == 7) { aRes += aVal * (3.0 * aDir.z * aDir.z - 1.0); }
581: else { aRes += aVal * (aDir.x * aDir.x - aDir.y * aDir.y); }
582: #endif
583: }
584:
585: return 4.0 * aRes * aCoef / float(uSamplesNum);
586: }
587: #endif
588:
589: #ifdef THE_TO_BAKE_SPECULAR
590: //! Computes a single sample for specular IBL map.
591: vec4 specularMapSample (in vec3 theNormal,
592: in float theRoughness,
593: in int theNumber,
594: in int theSize)
595: {
596: vec2 aHammersleyPoint = hammersley (theNumber, theSize);
597: vec3 aHalf = importanceSample (aHammersleyPoint, occRoughness (theRoughness));
598: float aHdotV = aHalf.z;
599: aHalf = fromTangentSpace (aHalf, theNormal);
600: vec3 aLight = -reflect (theNormal, aHalf);
601: float aNdotL = dot (aLight, theNormal);
602: if (aNdotL > 0.0)
603: {
604: float aSolidAngleSample = 1.0 / (float(theSize) * (occPBRDistribution (aHdotV, theRoughness) * 0.25 + 0.0001) + 0.0001);
605: float aLod = (theRoughness == 0.0) ? 0.0 : 0.5 * log2 (aSolidAngleSample / uEnvSolidAngleSource);
606: return vec4 (occTextureCubeLod (uEnvMap, aLight, aLod).rgb * aNdotL, aNdotL);
607: }
608: return vec4 (0.0);
609: }
610:
611: //! Bakes specular IBL map.
612: vec3 bakeSpecularMap (in vec3 theNormal,
613: in float theRoughness)
614: {
615: vec4 aResult = vec4(0.0);
616: if (theRoughness == 0.0)
617: {
618: aResult = specularMapSample (theNormal, theRoughness, 0, 1);
619: }
620: else
621: {
622: for (int aSampleIter = 0; aSampleIter < uSamplesNum; ++aSampleIter)
623: {
624: aResult += specularMapSample (theNormal, theRoughness, aSampleIter, uSamplesNum);
625: }
626: }
627: return aResult.xyz / aResult.w;
628: }
629: #endif
630:
631: void main()
632: {
633: vec3 aViewDirection = normalize (ViewDirection);
634: #ifdef THE_TO_BAKE_DIFFUSE
635: vec4 aRes = vec4 (bakeDiffuseSH(), 1.0);
636: #ifdef THE_TO_PACK_FLOAT
637: int aCompIndex = int(gl_FragCoord.y);
638: float aComp = aCompIndex == 0 ? aRes.x : (aCompIndex == 1 ? aRes.y : aRes.z);
639: int aFixedPrec = int(aComp * 2147483647.0);
640: int aFixedDiv1 = aFixedPrec / 256;
641: int aFixedDiv2 = aFixedDiv1 / 256;
642: int aFixedDiv3 = aFixedDiv2 / 256;
643: vec4 aPacked = vec4(float(aFixedPrec), float(aFixedDiv1), float(aFixedDiv2), float(aFixedDiv3));
644: aRes = fract (aPacked * (1.0 / 256.0));
645: #endif
646: occFragColor = aRes;
647: #else
648: float aRoughness = float(uCurrentLevel) / float(occNbSpecIBLLevels - 1);
649: occFragColor = vec4 (bakeSpecularMap (aViewDirection, aRoughness), 1.0);
650: #endif
651: }
TKOpenGl | Type: Error | ID: 0 | Severity: High | Message:
Failed to compile Fragment Shader [occt_pbr_env_baking_specular0000]. Compilation log:
0:606(15): error: no function with name 'textureCubeLod'
0:606(15): error: type mismatch
0:606(15): error: operands to arithmetic operators must be numeric
0:606(9): error: cannot construct `vec4' from a non-numeric data type
0:606(2): error: `return' with wrong type error, in function `specularMapSample' returning vec4
TKOpenGl | Type: Performance | ID: 0 | Severity: High | Message:
Error: baking PBR environment 512x512 takes too much time!.
TKOpenGl | Type: Portability | ID: 0 | Severity: Low | Message:
Fragment Shader [occt_phong-pbr-l_d-0000] compilation log:
0:575(2): warning: `BaseColor' used uninitialized
0:575(13): warning: `Metallic' used uninitialized
0:575(23): warning: `Roughness' used uninitialized
0:575(34): warning: `IOR' used uninitialized
0:610(58): warning: `Normal' used uninitialized
vlight headlight -enabled 0
TKOpenGl | Type: Portability | ID: 0 | Severity: Low | Message:
Fragment Shader [occt_phong-pbr-l_-0000] compilation log:
0:589(58): warning: `Normal' used uninitialized
| ||||
| Steps To Reproduce | test opengl background skydome | ||||
| Tags | No tags attached. | ||||
| Test case number | N/A | ||||
|
|
Branch CR33074 has been created by kgv. SHA-1: e22a231f876249110a7c1294dacc7bce10db6d4f Detailed log of new commits: Author: kgv Date: Fri Jul 22 10:55:28 2022 +0300 0033074: Visualization, TKOpenGl - PBR shader compilation error on Mesa OpenGL 3.10033074 Graphic3d_ShaderManager::getPBREnvBakingProgram() - fix setting Graphic3d_ShaderProgram::SetPBR() before defining GLSL version via defaultGlslVersion() that relies on this property. |
|
|
Please raise the patch - OCCT: branch CR33074. http://jenkins-test-occt.nnov.opencascade.com/view/CR33074-master-KGV/ |
|
|
Combination - OCCT branch : IR-2022-07-22 master SHA - changes and them, and you can discard any commits you make in this cb8519be19a3533b741f016d703119320de72ea6 changes and them, and you can discard any commits you make in this e0ceb716c70188b98130b1550914140d0502a6f9 Products branch : IR-2022-07-22 SHA - 7d10377b57d1c1ddf69852bf5b4e764f581c282f was compiled on Linux, MacOS and Windows platforms and tested in optimize mode. Number of compiler warnings: No new/fixed warnings Regressions/Differences/Improvements: No regressions/differences CPU differences: Debian80-64: OCCT Total CPU difference: 18704.32000000071 / 18688.950000000597 [+0.08%] Products Total CPU difference: 11922.590000000118 / 11921.05000000012 [+0.01%] Windows-64-VC14: OCCT Total CPU difference: 20723.546875 / 20746.84375 [-0.11%] Products Total CPU difference: 13486.40625 / 13479.375 [+0.05%] Image differences : No differences that require special attention Memory differences : No differences that require special attention |
|
|
Branch CR33074 has been deleted by mnt. SHA-1: e22a231f876249110a7c1294dacc7bce10db6d4f |
|
occt: master cb8519be 2022-07-22 10:55:28 Committer: |
0033074: Visualization, TKOpenGl - PBR shader compilation error on Mesa OpenGL 3.10033074 Graphic3d_ShaderManager::getPBREnvBakingProgram() - fix setting Graphic3d_ShaderProgram::SetPBR() before defining GLSL version via defaultGlslVersion() that relies on this property. |
Affected Issues 0033074 |
|
| mod - src/Graphic3d/Graphic3d_ShaderManager.cxx | Diff File | ||
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2022-07-22 10:52 | kgv | New Issue | |
| 2022-07-22 10:52 | kgv | Assigned To | => kgv |
| 2022-07-22 10:53 | kgv | Description Updated | |
| 2022-07-22 10:55 | git | Note Added: 0109937 | |
| 2022-07-22 10:59 | kgv | Relationship added | child of 0030700 |
| 2022-07-22 10:59 | kgv | Product Version | 7.6.0 => 7.5.0 |
| 2022-07-22 10:59 | kgv | Target Version | 7.7.0 => 7.6.3 |
| 2022-07-22 10:59 | kgv | Test case number | => N/A |
| 2022-07-22 12:37 | kgv | Assigned To | kgv => bugmaster |
| 2022-07-22 12:37 | kgv | Status | new => resolved |
| 2022-07-22 12:37 | kgv | Note Added: 0109940 | |
| 2022-07-22 12:37 | kgv | Status | resolved => reviewed |
| 2022-07-23 14:12 |
|
Status | reviewed => tested |
| 2022-07-23 14:12 |
|
Note Added: 0109961 | |
| 2022-07-23 15:29 |
|
Changeset attached | => occt master cb8519be |
| 2022-07-23 15:29 | kgv | Assigned To | bugmaster => kgv |
| 2022-07-23 15:29 | kgv | Status | tested => verified |
| 2022-07-23 15:29 | kgv | Resolution | open => fixed |
| 2022-07-23 15:38 | git | Note Added: 0109969 | |
| 2022-10-19 15:50 |
|
Assigned To | kgv => vpozdyayev |
| 2023-03-19 20:44 | vglukhik | Status | verified => closed |
| 2023-03-19 20:44 | vglukhik | Fixed in Version | => 7.7.0 |