mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 10:56:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			105 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
| #version 120
 | |
| 
 | |
| #if @useUBO
 | |
|     #extension GL_ARB_uniform_buffer_object : require
 | |
| #endif
 | |
| 
 | |
| #if @useGPUShader4
 | |
|     #extension GL_EXT_gpu_shader4: require
 | |
| #endif
 | |
| 
 | |
| varying vec2 uv;
 | |
| 
 | |
| uniform sampler2D diffuseMap;
 | |
| 
 | |
| #if @normalMap
 | |
| uniform sampler2D normalMap;
 | |
| #endif
 | |
| 
 | |
| #if @blendMap
 | |
| uniform sampler2D blendMap;
 | |
| #endif
 | |
| 
 | |
| varying float euclideanDepth;
 | |
| varying float linearDepth;
 | |
| 
 | |
| #define PER_PIXEL_LIGHTING (@normalMap || @specularMap || @forcePPL)
 | |
| 
 | |
| #if !PER_PIXEL_LIGHTING
 | |
| centroid varying vec3 passLighting;
 | |
| centroid varying vec3 passSpecular;
 | |
| centroid varying vec3 shadowDiffuseLighting;
 | |
| centroid varying vec3 shadowSpecularLighting;
 | |
| #endif
 | |
| varying vec3 passViewPos;
 | |
| varying vec3 passNormal;
 | |
| 
 | |
| uniform vec2 screenRes;
 | |
| uniform float far;
 | |
| 
 | |
| #include "vertexcolors.glsl"
 | |
| #include "shadows_fragment.glsl"
 | |
| #include "lib/light/lighting.glsl"
 | |
| #include "lib/material/parallax.glsl"
 | |
| #include "fog.glsl"
 | |
| #include "compatibility/normals.glsl"
 | |
| 
 | |
| void main()
 | |
| {
 | |
|     vec2 adjustedUV = (gl_TextureMatrix[0] * vec4(uv, 0.0, 1.0)).xy;
 | |
| 
 | |
| #if @parallax
 | |
|     adjustedUV += getParallaxOffset(transpose(normalToViewMatrix) * normalize(-passViewPos), texture2D(normalMap, adjustedUV).a, 1.f);
 | |
| #endif
 | |
|     vec4 diffuseTex = texture2D(diffuseMap, adjustedUV);
 | |
|     gl_FragData[0] = vec4(diffuseTex.xyz, 1.0);
 | |
| 
 | |
|     vec4 diffuseColor = getDiffuseColor();
 | |
|     gl_FragData[0].a *= diffuseColor.a;
 | |
| 
 | |
| #if @blendMap
 | |
|     vec2 blendMapUV = (gl_TextureMatrix[1] * vec4(uv, 0.0, 1.0)).xy;
 | |
|     gl_FragData[0].a *= texture2D(blendMap, blendMapUV).a;
 | |
| #endif
 | |
| 
 | |
| #if @normalMap
 | |
|     vec4 normalTex = texture2D(normalMap, adjustedUV);
 | |
|     vec3 normal = normalTex.xyz * 2.0 - 1.0;
 | |
| #if @reconstructNormalZ
 | |
|     normal.z = sqrt(1.0 - dot(normal.xy, normal.xy));
 | |
| #endif
 | |
|     vec3 viewNormal = normalToView(normal);
 | |
| #else
 | |
|     vec3 viewNormal = normalize(gl_NormalMatrix * passNormal);
 | |
| #endif
 | |
| 
 | |
|     float shadowing = unshadowedLightRatio(linearDepth);
 | |
|     vec3 lighting, specular;
 | |
| #if !PER_PIXEL_LIGHTING
 | |
|     lighting = passLighting + shadowDiffuseLighting * shadowing;
 | |
|     specular = passSpecular + shadowSpecularLighting * shadowing;
 | |
| #else
 | |
| #if @specularMap
 | |
|     float shininess = 128.0; // TODO: make configurable
 | |
|     vec3 specularColor = vec3(diffuseTex.a);
 | |
| #else
 | |
|     float shininess = gl_FrontMaterial.shininess;
 | |
|     vec3 specularColor = getSpecularColor().xyz;
 | |
| #endif
 | |
|     vec3 diffuseLight, ambientLight, specularLight;
 | |
|     doLighting(passViewPos, viewNormal, shininess, shadowing, diffuseLight, ambientLight, specularLight);
 | |
|     lighting = diffuseColor.xyz * diffuseLight + getAmbientColor().xyz * ambientLight + getEmissionColor().xyz;
 | |
|     specular = specularColor * specularLight;
 | |
| #endif
 | |
| 
 | |
|     clampLightingResult(lighting);
 | |
|     gl_FragData[0].xyz = gl_FragData[0].xyz * lighting + specular;
 | |
| 
 | |
|     gl_FragData[0] = applyFogAtDist(gl_FragData[0], euclideanDepth, linearDepth, far);
 | |
| 
 | |
| #if !@disableNormals && @writeNormals
 | |
|     gl_FragData[1].xyz = viewNormal * 0.5 + 0.5;
 | |
| #endif
 | |
| 
 | |
|     applyShadowDebugOverlay();
 | |
| }
 |