Package: openarena Version: 0.8.8+dfsg-2 Severity: grave Justification: renders package unusable
Dear Maintainer, * What led up to the situation? I attempted to launch the program. * What exactly did you do (or not do) that was effective (or ineffective)? Ran `openarena` from a terminal. * What was the outcome of this action? Program failed to launch with a lengthy error message (attached). * What outcome did you expect instead? I expected the program to launch normally. -- System Information: Debian Release: buster/sid APT prefers testing APT policy: (500, 'testing'), (1, 'experimental') Architecture: amd64 (x86_64) Kernel: Linux 4.19.0-2-amd64 (SMP w/2 CPU cores) Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8), LANGUAGE=en_GB:en (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled Versions of packages openarena depends on: ii ioquake3 1.36+u20181222.e5da13f~dfsg-1 ii libc6 2.28-7 ii openarena-081-maps 0.8.5split-11 ii openarena-081-misc 0.8.5split-11 ii openarena-081-players 0.8.5split-11 ii openarena-081-players-mature 0.8.5split-11 ii openarena-081-textures 0.8.5split-11 ii openarena-085-data 0.8.5split-11 ii openarena-088-data 0.8.8-9 ii openarena-data 0.8.5split-11 Versions of packages openarena recommends: ii openarena-oacmp1 3-4 openarena suggests no packages. Versions of packages ioquake3 depends on: ii ioquake3-server 1.36+u20181222.e5da13f~dfsg-1 ii libc6 2.28-7 ii libcurl3-gnutls 7.64.0-1 ii libgl1 1.1.0-1 ii libjpeg62-turbo 1:1.5.2-2+b1 ii libogg0 1.3.2-1+b1 ii libopenal1 1:1.19.1-1 ii libopus0 1.3-1 ii libopusfile0 0.9+20170913-1 ii libsdl2-2.0-0 2.0.9+dfsg1-1 ii libvorbis0a 1.3.6-2 ii libvorbisfile3 1.3.6-2 ii zlib1g 1:1.2.11.dfsg-1 Versions of packages ioquake3 recommends: ii x11-utils 7.7+4 -- no debconf information
[Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". tty] ioq3 1.36+u20181222.e5da13f~dfsg-1/Debian linux-x86_64 Jan 14 2019 tty] SSE instruction set enabled tty] ----- FS_Startup ----- tty] We are looking in the current search path: tty] /home/empty/.openarena/baseoa tty] /usr/lib/openarena/baseoa tty] /usr/lib/openarena/baseoa/z_oacmp-volume1-v3.pk3 (370 files) tty] /usr/lib/openarena/baseoa/pak6-patch088.pk3 (711 files) tty] /usr/lib/openarena/baseoa/pak6-patch085.pk3 (559 files) tty] /usr/lib/openarena/baseoa/pak6-misc.pk3 (229 files) tty] /usr/lib/openarena/baseoa/pak5-TA.pk3 (139 files) tty] /usr/lib/openarena/baseoa/pak4-textures.pk3 (1753 files) tty] /usr/lib/openarena/baseoa/pak2-players.pk3 (669 files) tty] /usr/lib/openarena/baseoa/pak2-players-mature.pk3 (231 files) tty] /usr/lib/openarena/baseoa/pak1-maps.pk3 (100 files) tty] /usr/lib/openarena/baseoa/pak0.pk3 (1042 files) tty] tty] ---------------------- tty] 5803 files in pk3 files tty] execing default.cfg tty] couldn't exec q3config.cfg tty] couldn't exec autoexec.cfg tty] Hunk_Clear: reset the hunk ok tty][Detaching after fork from child process 7475] ----- Client Initialization ----- tty] Couldn't read q3history. tty] ----- Initializing Renderer ---- tty] Trying to load "renderer_opengl2_x86_64.so" from "/usr/lib/ioquake3"... tty] ------------------------------- tty] QKEY found. tty] ----- Client Initialization Complete ----- tty] tty] tty]q ----- R_Init ----- tty]q[Detaching after fork from child process 7485] [New Thread 0x7f89daf18700 (LWP 7486)] SDL using driver "x11" tty]q Initializing OpenGL display tty]q Display aspect: 1.600 tty]q ...setting mode 3: 640 480 tty]q Trying to get an OpenGL 3.2 core context tty]q SDL_GL_CreateContext failed: Could not create GL context: GLXBadFBConfig tty]q Reverting to default context tty]q Using 24 color bits, 24 depth, 8 stencil display. tty]q Available modes: '640x400 1280x800 640x360 720x405 864x486 960x540 1024x576 1280x720 640x480 800x600 1024x768' tty]q GL_RENDERER: Mesa DRI Intel(R) Ironlake Mobile tty]q Initializing OpenGL extensions tty]q ...ignoring GL_EXT_texture_compression_s3tc tty]q ...ignoring GL_S3_s3tc tty]q ...ignoring GL_EXT_texture_filter_anisotropic tty]q ...using GL_ARB_framebuffer_object tty]q ...using GL_ARB_vertex_array_object tty]q ...using GL_ARB_texture_float tty]q ...using GL_ARB_depth_clamp tty]q ...ignoring GL_ARB_seamless_cube_map tty]q ...using GLSL version 1.20 tty]q ...GL_NVX_gpu_memory_info not found tty]q ...GL_ATI_meminfo not found tty]q ...ignoring GL_ARB_texture_compression_rgtc tty]q ...GL_ARB_texture_compression_bptc not found tty]q ...GL_EXT_direct_state_access not found tty]q ------- FBO_Init ------- tty]q ------- GLSL_InitGPUShaders ------- tty]q Shader source: tty]q #version 120 #define shadow2D(a,b) shadow2D(a,b).r #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #ifndef deformGen_t #define deformGen_t #define DGEN_WAVE_SIN 1 #define DGEN_WAVE_SQUARE 2 #define DGEN_WAVE_TRIANGLE 3 #define DGEN_WAVE_SAWTOOTH 4 #define DGEN_WAVE_INVERSE_SAWTOOTH 5 #define DGEN_BULGE 7 #define DGEN_MOVE 8 #endif #ifndef tcGen_t #define tcGen_t #define TCGEN_LIGHTMAP 2 #define TCGEN_TEXTURE 3 #define TCGEN_ENVIRONMENT_MAPPED 4 #define TCGEN_FOG 5 #define TCGEN_VECTOR 6 #endif #ifndef colorGen_t #define colorGen_t #define CGEN_LIGHTING_DIFFUSE 11 #endif #ifndef alphaGen_t #define alphaGen_t #define AGEN_LIGHTING_SPECULAR 6 #define AGEN_PORTAL 8 #endif #ifndef r_FBufScale #define r_FBufScale vec2(0.001563, 0.002083) #endif #line 0 uniform sampler2D u_DiffuseMap; #if defined(USE_LIGHTMAP) uniform sampler2D u_LightMap; #endif #if defined(USE_NORMALMAP) uniform sampler2D u_NormalMap; #endif #if defined(USE_DELUXEMAP) uniform sampler2D u_DeluxeMap; #endif #if defined(USE_SPECULARMAP) uniform sampler2D u_SpecularMap; #endif #if defined(USE_SHADOWMAP) uniform sampler2D u_ShadowMap; #endif #if defined(USE_CUBEMAP) uniform samplerCube u_CubeMap; #endif #if defined(USE_NORMALMAP) || defined(USE_DELUXEMAP) || defined(USE_SPECULARMAP) || defined(USE_CUBEMAP) // y = deluxe, w = cube uniform vec4 u_EnableTextures; #endif #if defined(USE_PRIMARY_LIGHT) || defined(USE_SHADOWMAP) uniform vec3 u_PrimaryLightColor; uniform vec3 u_PrimaryLightAmbient; #endif #if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT) uniform vec4 u_NormalScale; uniform vec4 u_SpecularScale; #endif #if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT) #if defined(USE_CUBEMAP) uniform vec4 u_CubeMapInfo; #endif #endif uniform int u_AlphaTest; varying vec4 var_TexCoords; varying vec4 var_Color; #if (defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)) varying vec4 var_ColorAmbient; #endif #if (defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)) varying vec4 var_Normal; varying vec4 var_Tangent; varying vec4 var_Bitangent; #endif #if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT) varying vec4 var_LightDir; #endif #if defined(USE_PRIMARY_LIGHT) || defined(USE_SHADOWMAP) varying vec4 var_PrimaryLightDir; #endif #define EPSILON 0.00000001 #if defined(USE_PARALLAXMAP) float SampleDepth(sampler2D normalMap, vec2 t) { #if defined(SWIZZLE_NORMALMAP) return 1.0 - texture2D(normalMap, t).r; #else return 1.0 - texture2D(normalMap, t).a; #endif } float RayIntersectDisplaceMap(vec2 dp, vec2 ds, sampler2D normalMap) { const int linearSearchSteps = 16; const int binarySearchSteps = 6; // current size of search window float size = 1.0 / float(linearSearchSteps); // current depth position float depth = 0.0; // best match found (starts with last position 1.0) float bestDepth = 1.0; // texture depth at best depth float texDepth = 0.0; float prevT = SampleDepth(normalMap, dp); float prevTexDepth = prevT; // search front to back for first point inside object for(int i = 0; i < linearSearchSteps - 1; ++i) { depth += size; float t = SampleDepth(normalMap, dp + ds * depth); if(bestDepth > 0.996) // if no depth found yet if(depth >= t) { bestDepth = depth; // store best depth texDepth = t; prevTexDepth = prevT; } prevT = t; } depth = bestDepth; #if !defined (USE_RELIEFMAP) float div = 1.0 / (1.0 + (prevTexDepth - texDepth) * float(linearSearchSteps)); bestDepth -= (depth - size - prevTexDepth) * div; #else // recurse around first point (depth) for closest match for(int i = 0; i < binarySearchSteps; ++i) { size *= 0.5; float t = SampleDepth(normalMap, dp + ds * depth); if(depth >= t) { bestDepth = depth; depth -= 2.0 * size; } depth += size; } #endif return bestDepth; } #endif vec3 CalcDiffuse(vec3 diffuseAlbedo, float NH, float EH, float roughness) { #if defined(USE_BURLEY) // modified from https://disney-animation.s3.amazonaws.com/library/s2012_pbs_disney_brdf_notes_v2.pdf float fd90 = -0.5 + EH * EH * roughness; float burley = 1.0 + fd90 * 0.04 / NH; burley *= burley; return diffuseAlbedo * burley; #else return diffuseAlbedo; #endif } vec3 EnvironmentBRDF(float roughness, float NE, vec3 specular) { // from http://community.arm.com/servlet/JiveServlet/download/96891546-19496/siggraph2015-mmg-renaldas-slides.pdf float v = 1.0 - max(roughness, NE); v *= v * v; return vec3(v) + specular; } vec3 CalcSpecular(vec3 specular, float NH, float EH, float roughness) { // from http://community.arm.com/servlet/JiveServlet/download/96891546-19496/siggraph2015-mmg-renaldas-slides.pdf float rr = roughness*roughness; float rrrr = rr*rr; float d = (NH * NH) * (rrrr - 1.0) + 1.0; float v = (EH * EH) * (roughness + 0.5); return specular * (rrrr / (4.0 * d * d * v)); } float CalcLightAttenuation(float point, float normDist) { // zero light at 1.0, approximating q3 style // also don't attenuate directional light float attenuation = (0.5 * normDist - 1.5) * point + 1.0; // clamp attenuation #if defined(NO_LIGHT_CLAMP) attenuation = max(attenuation, 0.0); #else attenuation = clamp(attenuation, 0.0, 1.0); #endif return attenuation; } vec4 hitCube(vec3 ray, vec3 pos, vec3 invSize, float lod, samplerCube tex) { // find any hits on cubemap faces facing the camera vec3 scale = (sign(ray) - pos) / ray; // find the nearest hit float minScale = min(min(scale.x, scale.y), scale.z); // if the nearest hit is behind the camera, ignore // should not be necessary as long as pos is inside the cube //if (minScale < 0.0) //return vec4(0.0); // calculate the hit position, that's our texture coordinates vec3 tc = pos + ray * minScale; // if the texture coordinates are outside the cube, ignore // necessary since we're not fading out outside the cube if (any(greaterThan(abs(tc), vec3(1.00001)))) return vec4(0.0); // fade out when approaching the cubemap edges //vec3 fade3 = abs(pos); //float fade = max(max(fade3.x, fade3.y), fade3.z); //fade = clamp(1.0 - fade, 0.0, 1.0); //return vec4(textureCubeLod(tex, tc, lod).rgb * fade, fade); return vec4(textureCubeLod(tex, tc, lod).rgb, 1.0); } void main() { vec3 viewDir, lightColor, ambientColor, reflectance; vec3 L, N, E, H; float NL, NH, NE, EH, attenuation; #if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT) mat3 tangentToWorld = mat3(var_Tangent.xyz, var_Bitangent.xyz, var_Normal.xyz); viewDir = vec3(var_Normal.w, var_Tangent.w, var_Bitangent.w); E = normalize(viewDir); #endif lightColor = var_Color.rgb; #if defined(USE_LIGHTMAP) vec4 lightmapColor = texture2D(u_LightMap, var_TexCoords.zw); #if defined(RGBM_LIGHTMAP) lightmapColor.rgb *= lightmapColor.a; #endif #if defined(USE_PBR) && !defined(USE_FAST_LIGHT) lightmapColor.rgb *= lightmapColor.rgb; #endif lightColor *= lightmapColor.rgb; #endif vec2 texCoords = var_TexCoords.xy; #if defined(USE_PARALLAXMAP) vec3 offsetDir = viewDir * tangentToWorld; offsetDir.xy *= -u_NormalScale.a / offsetDir.z; texCoords += offsetDir.xy * RayIntersectDisplaceMap(texCoords, offsetDir.xy, u_NormalMap); #endif vec4 diffuse = texture2D(u_DiffuseMap, texCoords); float alpha = diffuse.a * var_Color.a; if (u_AlphaTest == 1) { if (alpha == 0.0) discard; } else if (u_AlphaTest == 2) { if (alpha >= 0.5) discard; } else if (u_AlphaTest == 3) { if (alpha < 0.5) discard; } #if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT) L = var_LightDir.xyz; #if defined(USE_DELUXEMAP) L += (texture2D(u_DeluxeMap, var_TexCoords.zw).xyz - vec3(0.5)) * u_EnableTextures.y; #endif float sqrLightDist = dot(L, L); L /= sqrt(sqrLightDist); #if defined(USE_LIGHT_VECTOR) attenuation = CalcLightAttenuation(float(var_LightDir.w > 0.0), var_LightDir.w / sqrLightDist); #else attenuation = 1.0; #endif #if defined(USE_NORMALMAP) #if defined(SWIZZLE_NORMALMAP) N.xy = texture2D(u_NormalMap, texCoords).ag - vec2(0.5); #else N.xy = texture2D(u_NormalMap, texCoords).rg - vec2(0.5); #endif N.xy *= u_NormalScale.xy; N.z = sqrt(clamp((0.25 - N.x * N.x) - N.y * N.y, 0.0, 1.0)); N = tangentToWorld * N; #else N = var_Normal.xyz; #endif N = normalize(N); #if defined(USE_SHADOWMAP) vec2 shadowTex = gl_FragCoord.xy * r_FBufScale; float shadowValue = texture2D(u_ShadowMap, shadowTex).r; // surfaces not facing the light are always shadowed shadowValue *= clamp(dot(N, var_PrimaryLightDir.xyz), 0.0, 1.0); #if defined(SHADOWMAP_MODULATE) lightColor *= shadowValue * (1.0 - u_PrimaryLightAmbient.r) + u_PrimaryLightAmbient.r; #endif #endif #if !defined(USE_LIGHT_VECTOR) ambientColor = lightColor; float surfNL = clamp(dot(var_Normal.xyz, L), 0.0, 1.0); // reserve 25% ambient to avoid black areas on normalmaps lightColor *= 0.75; // Scale the incoming light to compensate for the baked-in light angle // attenuation. lightColor /= max(surfNL, 0.25); // Recover any unused light as ambient, in case attenuation is over 4x or // light is below the surface ambientColor = max(ambientColor - lightColor * surfNL, vec3(0.0)); #else ambientColor = var_ColorAmbient.rgb; #endif NL = clamp(dot(N, L), 0.0, 1.0); NE = clamp(dot(N, E), 0.0, 1.0); H = normalize(L + E); EH = clamp(dot(E, H), 0.0, 1.0); NH = clamp(dot(N, H), 0.0, 1.0); #if defined(USE_SPECULARMAP) vec4 specular = texture2D(u_SpecularMap, texCoords); #else vec4 specular = vec4(1.0); #endif specular *= u_SpecularScale; #if defined(USE_PBR) diffuse.rgb *= diffuse.rgb; #endif #if defined(USE_PBR) // diffuse rgb is base color // specular red is gloss // specular green is metallicness float gloss = specular.r; float metal = specular.g; specular.rgb = metal * diffuse.rgb + vec3(0.04 - 0.04 * metal); diffuse.rgb *= 1.0 - metal; #else // diffuse rgb is diffuse // specular rgb is specular reflectance at normal incidence // specular alpha is gloss float gloss = specular.a; // adjust diffuse by specular reflectance, to maintain energy conservation diffuse.rgb *= vec3(1.0) - specular.rgb; #endif #if defined(GLOSS_IS_GLOSS) float roughness = exp2(-3.0 * gloss); #elif defined(GLOSS_IS_SMOOTHNESS) float roughness = 1.0 - gloss; #elif defined(GLOSS_IS_ROUGHNESS) float roughness = gloss; #elif defined(GLOSS_IS_SHININESS) float roughness = pow(2.0 / (8190.0 * gloss + 2.0), 0.25); #endif reflectance = CalcDiffuse(diffuse.rgb, NH, EH, roughness); #if defined(r_deluxeSpecular) #if defined(USE_LIGHT_VECTOR) reflectance += CalcSpecular(specular.rgb, NH, EH, roughness) * r_deluxeSpecular; #else reflectance += CalcSpecular(specular.rgb, NH, EH, pow(roughness, r_deluxeSpecular)); #endif #endif gl_FragColor.rgb = lightColor * reflectance * (attenuation * NL); gl_FragColor.rgb += ambientColor * diffuse.rgb; #if defined(USE_CUBEMAP) reflectance = EnvironmentBRDF(roughness, NE, specular.rgb); vec3 R = reflect(E, N); // parallax corrected cubemap (cheaper trick) // from http://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/ vec3 parallax = u_CubeMapInfo.xyz + u_CubeMapInfo.w * viewDir; #if defined(USE_BOX_CUBEMAP_PARALLAX) vec3 cubeLightColor = hitCube(R * u_CubeMapInfo.w, parallax, u_CubeMapInfo.www, ROUGHNESS_MIPS * roughness, u_CubeMap).rgb * u_EnableTextures.w; #else vec3 cubeLightColor = textureCubeLod(u_CubeMap, R + parallax, ROUGHNESS_MIPS * roughness).rgb * u_EnableTextures.w; #endif // normalize cubemap based on last roughness mip (~diffuse) // multiplying cubemap values by lighting below depends on either this or the cubemap being normalized at generation //vec3 cubeLightDiffuse = max(textureCubeLod(u_CubeMap, N, ROUGHNESS_MIPS).rgb, 0.5 / 255.0); //cubeLightColor /= dot(cubeLightDiffuse, vec3(0.2125, 0.7154, 0.0721)); #if defined(USE_PBR) cubeLightColor *= cubeLightColor; #endif // multiply cubemap values by lighting // not technically correct, but helps make reflections look less unnatural //cubeLightColor *= lightColor * (attenuation * NL) + ambientColor; gl_FragColor.rgb += cubeLightColor * reflectance; #endif #if defined(USE_PRIMARY_LIGHT) || defined(SHADOWMAP_MODULATE) vec3 L2, H2; float NL2, EH2, NH2; L2 = var_PrimaryLightDir.xyz; // enable when point lights are supported as primary lights //sqrLightDist = dot(L2, L2); //L2 /= sqrt(sqrLightDist); NL2 = clamp(dot(N, L2), 0.0, 1.0); H2 = normalize(L2 + E); EH2 = clamp(dot(E, H2), 0.0, 1.0); NH2 = clamp(dot(N, H2), 0.0, 1.0); reflectance = CalcSpecular(specular.rgb, NH2, EH2, roughness); // bit of a hack, with modulated shadowmaps, ignore diffuse #if !defined(SHADOWMAP_MODULATE) reflectance += CalcDiffuse(diffuse.rgb, NH2, EH2, roughness); #endif lightColor = u_PrimaryLightColor; #if defined(USE_SHADOWMAP) lightColor *= shadowValue; #endif // enable when point lights are supported as primary lights //lightColor *= CalcLightAttenuation(float(u_PrimaryLightDir.w > 0.0), u_PrimaryLightDir.w / sqrLightDist); gl_FragColor.rgb += lightColor * reflectance * NL2; #endif #if defined(USE_PBR) gl_FragColor.rgb = sqrt(gl_FragColor.rgb); #endif #else gl_FragColor.rgb = diffuse.rgb * lightColor; #endif gl_FragColor.a = alpha; } tty]q tty]q Shader info log: tty]q 0:224(14): error: no matching function for call to `textureCubeLod(samplerCube, vec3, float)'; candidates are: 0:224(14): error: type mismatch 0:224(9): error: cannot construct `vec4' from a non-numeric data type 0:224(2): error: `return' with wrong type error, in function `hitCube' returning vec4 tty]q ******************** ERROR: Couldn't compile shader ******************** tty]q RE_Shutdown( 0 ) tty]q Hunk_Clear: reset the hunk ok tty]q ----- R_Init ----- tty]q ------- FBO_Init ------- tty]q ------- GLSL_InitGPUShaders ------- tty]q Shader source: tty]q #version 120 #define shadow2D(a,b) shadow2D(a,b).r #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #ifndef deformGen_t #define deformGen_t #define DGEN_WAVE_SIN 1 #define DGEN_WAVE_SQUARE 2 #define DGEN_WAVE_TRIANGLE 3 #define DGEN_WAVE_SAWTOOTH 4 #define DGEN_WAVE_INVERSE_SAWTOOTH 5 #define DGEN_BULGE 7 #define DGEN_MOVE 8 #endif #ifndef tcGen_t #define tcGen_t #define TCGEN_LIGHTMAP 2 #define TCGEN_TEXTURE 3 #define TCGEN_ENVIRONMENT_MAPPED 4 #define TCGEN_FOG 5 #define TCGEN_VECTOR 6 #endif #ifndef colorGen_t #define colorGen_t #define CGEN_LIGHTING_DIFFUSE 11 #endif #ifndef alphaGen_t #define alphaGen_t #define AGEN_LIGHTING_SPECULAR 6 #define AGEN_PORTAL 8 #endif #ifndef r_FBufScale #define r_FBufScale vec2(0.001563, 0.002083) #endif #line 0 uniform sampler2D u_DiffuseMap; #if defined(USE_LIGHTMAP) uniform sampler2D u_LightMap; #endif #if defined(USE_NORMALMAP) uniform sampler2D u_NormalMap; #endif #if defined(USE_DELUXEMAP) uniform sampler2D u_DeluxeMap; #endif #if defined(USE_SPECULARMAP) uniform sampler2D u_SpecularMap; #endif #if defined(USE_SHADOWMAP) uniform sampler2D u_ShadowMap; #endif #if defined(USE_CUBEMAP) uniform samplerCube u_CubeMap; #endif #if defined(USE_NORMALMAP) || defined(USE_DELUXEMAP) || defined(USE_SPECULARMAP) || defined(USE_CUBEMAP) // y = deluxe, w = cube uniform vec4 u_EnableTextures; #endif #if defined(USE_PRIMARY_LIGHT) || defined(USE_SHADOWMAP) uniform vec3 u_PrimaryLightColor; uniform vec3 u_PrimaryLightAmbient; #endif #if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT) uniform vec4 u_NormalScale; uniform vec4 u_SpecularScale; #endif #if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT) #if defined(USE_CUBEMAP) uniform vec4 u_CubeMapInfo; #endif #endif uniform int u_AlphaTest; varying vec4 var_TexCoords; varying vec4 var_Color; #if (defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)) varying vec4 var_ColorAmbient; #endif #if (defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)) varying vec4 var_Normal; varying vec4 var_Tangent; varying vec4 var_Bitangent; #endif #if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT) varying vec4 var_LightDir; #endif #if defined(USE_PRIMARY_LIGHT) || defined(USE_SHADOWMAP) varying vec4 var_PrimaryLightDir; #endif #define EPSILON 0.00000001 #if defined(USE_PARALLAXMAP) float SampleDepth(sampler2D normalMap, vec2 t) { #if defined(SWIZZLE_NORMALMAP) return 1.0 - texture2D(normalMap, t).r; #else return 1.0 - texture2D(normalMap, t).a; #endif } float RayIntersectDisplaceMap(vec2 dp, vec2 ds, sampler2D normalMap) { const int linearSearchSteps = 16; const int binarySearchSteps = 6; // current size of search window float size = 1.0 / float(linearSearchSteps); // current depth position float depth = 0.0; // best match found (starts with last position 1.0) float bestDepth = 1.0; // texture depth at best depth float texDepth = 0.0; float prevT = SampleDepth(normalMap, dp); float prevTexDepth = prevT; // search front to back for first point inside object for(int i = 0; i < linearSearchSteps - 1; ++i) { depth += size; float t = SampleDepth(normalMap, dp + ds * depth); if(bestDepth > 0.996) // if no depth found yet if(depth >= t) { bestDepth = depth; // store best depth texDepth = t; prevTexDepth = prevT; } prevT = t; } depth = bestDepth; #if !defined (USE_RELIEFMAP) float div = 1.0 / (1.0 + (prevTexDepth - texDepth) * float(linearSearchSteps)); bestDepth -= (depth - size - prevTexDepth) * div; #else // recurse around first point (depth) for closest match for(int i = 0; i < binarySearchSteps; ++i) { size *= 0.5; float t = SampleDepth(normalMap, dp + ds * depth); if(depth >= t) { bestDepth = depth; depth -= 2.0 * size; } depth += size; } #endif return bestDepth; } #endif vec3 CalcDiffuse(vec3 diffuseAlbedo, float NH, float EH, float roughness) { #if defined(USE_BURLEY) // modified from https://disney-animation.s3.amazonaws.com/library/s2012_pbs_disney_brdf_notes_v2.pdf float fd90 = -0.5 + EH * EH * roughness; float burley = 1.0 + fd90 * 0.04 / NH; burley *= burley; return diffuseAlbedo * burley; #else return diffuseAlbedo; #endif } vec3 EnvironmentBRDF(float roughness, float NE, vec3 specular) { // from http://community.arm.com/servlet/JiveServlet/download/96891546-19496/siggraph2015-mmg-renaldas-slides.pdf float v = 1.0 - max(roughness, NE); v *= v * v; return vec3(v) + specular; } vec3 CalcSpecular(vec3 specular, float NH, float EH, float roughness) { // from http://community.arm.com/servlet/JiveServlet/download/96891546-19496/siggraph2015-mmg-renaldas-slides.pdf float rr = roughness*roughness; float rrrr = rr*rr; float d = (NH * NH) * (rrrr - 1.0) + 1.0; float v = (EH * EH) * (roughness + 0.5); return specular * (rrrr / (4.0 * d * d * v)); } float CalcLightAttenuation(float point, float normDist) { // zero light at 1.0, approximating q3 style // also don't attenuate directional light float attenuation = (0.5 * normDist - 1.5) * point + 1.0; // clamp attenuation #if defined(NO_LIGHT_CLAMP) attenuation = max(attenuation, 0.0); #else attenuation = clamp(attenuation, 0.0, 1.0); #endif return attenuation; } vec4 hitCube(vec3 ray, vec3 pos, vec3 invSize, float lod, samplerCube tex) { // find any hits on cubemap faces facing the camera vec3 scale = (sign(ray) - pos) / ray; // find the nearest hit float minScale = min(min(scale.x, scale.y), scale.z); // if the nearest hit is behind the camera, ignore // should not be necessary as long as pos is inside the cube //if (minScale < 0.0) //return vec4(0.0); // calculate the hit position, that's our texture coordinates vec3 tc = pos + ray * minScale; // if the texture coordinates are outside the cube, ignore // necessary since we're not fading out outside the cube if (any(greaterThan(abs(tc), vec3(1.00001)))) return vec4(0.0); // fade out when approaching the cubemap edges //vec3 fade3 = abs(pos); //float fade = max(max(fade3.x, fade3.y), fade3.z); //fade = clamp(1.0 - fade, 0.0, 1.0); //return vec4(textureCubeLod(tex, tc, lod).rgb * fade, fade); return vec4(textureCubeLod(tex, tc, lod).rgb, 1.0); } void main() { vec3 viewDir, lightColor, ambientColor, reflectance; vec3 L, N, E, H; float NL, NH, NE, EH, attenuation; #if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT) mat3 tangentToWorld = mat3(var_Tangent.xyz, var_Bitangent.xyz, var_Normal.xyz); viewDir = vec3(var_Normal.w, var_Tangent.w, var_Bitangent.w); E = normalize(viewDir); #endif lightColor = var_Color.rgb; #if defined(USE_LIGHTMAP) vec4 lightmapColor = texture2D(u_LightMap, var_TexCoords.zw); #if defined(RGBM_LIGHTMAP) lightmapColor.rgb *= lightmapColor.a; #endif #if defined(USE_PBR) && !defined(USE_FAST_LIGHT) lightmapColor.rgb *= lightmapColor.rgb; #endif lightColor *= lightmapColor.rgb; #endif vec2 texCoords = var_TexCoords.xy; #if defined(USE_PARALLAXMAP) vec3 offsetDir = viewDir * tangentToWorld; offsetDir.xy *= -u_NormalScale.a / offsetDir.z; texCoords += offsetDir.xy * RayIntersectDisplaceMap(texCoords, offsetDir.xy, u_NormalMap); #endif vec4 diffuse = texture2D(u_DiffuseMap, texCoords); float alpha = diffuse.a * var_Color.a; if (u_AlphaTest == 1) { if (alpha == 0.0) discard; } else if (u_AlphaTest == 2) { if (alpha >= 0.5) discard; } else if (u_AlphaTest == 3) { if (alpha < 0.5) discard; } #if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT) L = var_LightDir.xyz; #if defined(USE_DELUXEMAP) L += (texture2D(u_DeluxeMap, var_TexCoords.zw).xyz - vec3(0.5)) * u_EnableTextures.y; #endif float sqrLightDist = dot(L, L); L /= sqrt(sqrLightDist); #if defined(USE_LIGHT_VECTOR) attenuation = CalcLightAttenuation(float(var_LightDir.w > 0.0), var_LightDir.w / sqrLightDist); #else attenuation = 1.0; #endif #if defined(USE_NORMALMAP) #if defined(SWIZZLE_NORMALMAP) N.xy = texture2D(u_NormalMap, texCoords).ag - vec2(0.5); #else N.xy = texture2D(u_NormalMap, texCoords).rg - vec2(0.5); #endif N.xy *= u_NormalScale.xy; N.z = sqrt(clamp((0.25 - N.x * N.x) - N.y * N.y, 0.0, 1.0)); N = tangentToWorld * N; #else N = var_Normal.xyz; #endif N = normalize(N); #if defined(USE_SHADOWMAP) vec2 shadowTex = gl_FragCoord.xy * r_FBufScale; float shadowValue = texture2D(u_ShadowMap, shadowTex).r; // surfaces not facing the light are always shadowed shadowValue *= clamp(dot(N, var_PrimaryLightDir.xyz), 0.0, 1.0); #if defined(SHADOWMAP_MODULATE) lightColor *= shadowValue * (1.0 - u_PrimaryLightAmbient.r) + u_PrimaryLightAmbient.r; #endif #endif #if !defined(USE_LIGHT_VECTOR) ambientColor = lightColor; float surfNL = clamp(dot(var_Normal.xyz, L), 0.0, 1.0); // reserve 25% ambient to avoid black areas on normalmaps lightColor *= 0.75; // Scale the incoming light to compensate for the baked-in light angle // attenuation. lightColor /= max(surfNL, 0.25); // Recover any unused light as ambient, in case attenuation is over 4x or // light is below the surface ambientColor = max(ambientColor - lightColor * surfNL, vec3(0.0)); #else ambientColor = var_ColorAmbient.rgb; #endif NL = clamp(dot(N, L), 0.0, 1.0); NE = clamp(dot(N, E), 0.0, 1.0); H = normalize(L + E); EH = clamp(dot(E, H), 0.0, 1.0); NH = clamp(dot(N, H), 0.0, 1.0); #if defined(USE_SPECULARMAP) vec4 specular = texture2D(u_SpecularMap, texCoords); #else vec4 specular = vec4(1.0); #endif specular *= u_SpecularScale; #if defined(USE_PBR) diffuse.rgb *= diffuse.rgb; #endif #if defined(USE_PBR) // diffuse rgb is base color // specular red is gloss // specular green is metallicness float gloss = specular.r; float metal = specular.g; specular.rgb = metal * diffuse.rgb + vec3(0.04 - 0.04 * metal); diffuse.rgb *= 1.0 - metal; #else // diffuse rgb is diffuse // specular rgb is specular reflectance at normal incidence // specular alpha is gloss float gloss = specular.a; // adjust diffuse by specular reflectance, to maintain energy conservation diffuse.rgb *= vec3(1.0) - specular.rgb; #endif #if defined(GLOSS_IS_GLOSS) float roughness = exp2(-3.0 * gloss); #elif defined(GLOSS_IS_SMOOTHNESS) float roughness = 1.0 - gloss; #elif defined(GLOSS_IS_ROUGHNESS) float roughness = gloss; #elif defined(GLOSS_IS_SHININESS) float roughness = pow(2.0 / (8190.0 * gloss + 2.0), 0.25); #endif reflectance = CalcDiffuse(diffuse.rgb, NH, EH, roughness); #if defined(r_deluxeSpecular) #if defined(USE_LIGHT_VECTOR) reflectance += CalcSpecular(specular.rgb, NH, EH, roughness) * r_deluxeSpecular; #else reflectance += CalcSpecular(specular.rgb, NH, EH, pow(roughness, r_deluxeSpecular)); #endif #endif gl_FragColor.rgb = lightColor * reflectance * (attenuation * NL); gl_FragColor.rgb += ambientColor * diffuse.rgb; #if defined(USE_CUBEMAP) reflectance = EnvironmentBRDF(roughness, NE, specular.rgb); vec3 R = reflect(E, N); // parallax corrected cubemap (cheaper trick) // from http://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/ vec3 parallax = u_CubeMapInfo.xyz + u_CubeMapInfo.w * viewDir; #if defined(USE_BOX_CUBEMAP_PARALLAX) vec3 cubeLightColor = hitCube(R * u_CubeMapInfo.w, parallax, u_CubeMapInfo.www, ROUGHNESS_MIPS * roughness, u_CubeMap).rgb * u_EnableTextures.w; #else vec3 cubeLightColor = textureCubeLod(u_CubeMap, R + parallax, ROUGHNESS_MIPS * roughness).rgb * u_EnableTextures.w; #endif // normalize cubemap based on last roughness mip (~diffuse) // multiplying cubemap values by lighting below depends on either this or the cubemap being normalized at generation //vec3 cubeLightDiffuse = max(textureCubeLod(u_CubeMap, N, ROUGHNESS_MIPS).rgb, 0.5 / 255.0); //cubeLightColor /= dot(cubeLightDiffuse, vec3(0.2125, 0.7154, 0.0721)); #if defined(USE_PBR) cubeLightColor *= cubeLightColor; #endif // multiply cubemap values by lighting // not technically correct, but helps make reflections look less unnatural //cubeLightColor *= lightColor * (attenuation * NL) + ambientColor; gl_FragColor.rgb += cubeLightColor * reflectance; #endif #if defined(USE_PRIMARY_LIGHT) || defined(SHADOWMAP_MODULATE) vec3 L2, H2; float NL2, EH2, NH2; L2 = var_PrimaryLightDir.xyz; // enable when point lights are supported as primary lights //sqrLightDist = dot(L2, L2); //L2 /= sqrt(sqrLightDist); NL2 = clamp(dot(N, L2), 0.0, 1.0); H2 = normalize(L2 + E); EH2 = clamp(dot(E, H2), 0.0, 1.0); NH2 = clamp(dot(N, H2), 0.0, 1.0); reflectance = CalcSpecular(specular.rgb, NH2, EH2, roughness); // bit of a hack, with modulated shadowmaps, ignore diffuse #if !defined(SHADOWMAP_MODULATE) reflectance += CalcDiffuse(diffuse.rgb, NH2, EH2, roughness); #endif lightColor = u_PrimaryLightColor; #if defined(USE_SHADOWMAP) lightColor *= shadowValue; #endif // enable when point lights are supported as primary lights //lightColor *= CalcLightAttenuation(float(u_PrimaryLightDir.w > 0.0), u_PrimaryLightDir.w / sqrLightDist); gl_FragColor.rgb += lightColor * reflectance * NL2; #endif #if defined(USE_PBR) gl_FragColor.rgb = sqrt(gl_FragColor.rgb); #endif #else gl_FragColor.rgb = diffuse.rgb * lightColor; #endif gl_FragColor.a = alpha; } tty]q tty]q Shader info log: tty]q 0:224(14): error: no matching function for call to `textureCubeLod(samplerCube, vec3, float)'; candidates are: 0:224(14): error: type mismatch 0:224(9): error: cannot construct `vec4' from a non-numeric data type 0:224(2): error: `return' with wrong type error, in function `hitCube' returning vec4 tty]q recursive error after: Couldn't compile shader tty]q[Detaching after fork from child process 7487] [Thread 0x7f89e6d3d680 (LWP 7470) exited] [Inferior 1 (process 7470) exited with code 03] The program is not being run.