Normal maps for deferred+

This commit is contained in:
Lubos Lenco 2017-04-01 10:06:49 +02:00
parent fc81c6af6c
commit 391fea23d2
6 changed files with 24 additions and 20 deletions

View file

@ -106,11 +106,6 @@
"link": "_lampSizeUV",
"ifdef": ["_PCSS"]
},
{
"name": "senvmapBrdf",
"link": "_envmapBrdf",
"ifdef": ["_VoxelGI"]
},
{
"name": "VP",
"link": "_viewProjectionMatrix",

View file

@ -1,10 +1,8 @@
// http://www.thetenthplanet.de/archives/1180
mat3 cotangentFrame(vec3 n, vec3 p, vec2 texCoord) {
mat3 cotangentFrame(const vec3 n, const vec3 p, const vec2 duv1, const vec2 duv2) {
// Get edge vectors of the pixel triangle
vec3 dp1 = dFdx(p);
vec3 dp2 = dFdy(p);
vec2 duv1 = dFdx(texCoord);
vec2 duv2 = dFdy(texCoord);
// Solve the linear system
vec3 dp2perp = cross(dp2, n);
@ -17,6 +15,10 @@ mat3 cotangentFrame(vec3 n, vec3 p, vec2 texCoord) {
return mat3(t * invmax, b * invmax, n);
}
mat3 cotangentFrame(const vec3 n, const vec3 p, const vec2 texCoord) {
return cotangentFrame(n, p, dFdx(texCoord), dFdy(texCoord));
}
// vec3 perturbNormal(vec3 n, vec3 v, vec2 texCoord) {
// Assume N, the interpolated vertex normal and V, the view vector (vertex to eye)
// vec3 map = texture(snormal, texCoord).xyz * (255.0 / 127.0) - (128.0 / 127.0);

View file

@ -835,16 +835,21 @@ def parse_normal_map_color_input(inp, str_inp=None):
return
frag.write_pre = True
parse_teximage_vector = False # Force texCoord for normal map image vector
if bpy.data.worlds['Arm'].arm_export_tangents:
defplus = bpy.data.cameras[0].rp_renderer == 'Deferred Plus'
if not bpy.data.worlds['Arm'].arm_export_tangents or defplus: # Compute TBN matrix
frag.write('vec3 texn = ({0}) * 2.0 - 1.0;'.format(parse_vector_input(inp)))
frag.add_include('../../Shaders/std/normals.glsl')
if defplus:
frag.write('mat3 TBN = cotangentFrame(n, -vVec, g2.xy, g2.zw);')
else:
frag.write('mat3 TBN = cotangentFrame(n, -vVec, texCoord);')
frag.write('n = TBN * normalize(texn);')
else:
frag.write('vec3 n = ({0}) * 2.0 - 1.0;'.format(parse_vector_input(inp)))
# frag.write('n = normalize(TBN * normalize(n));')
frag.write('n = TBN * normalize(n);')
mat_state.data.add_elem('tang', 3)
else: # Compute TBN matrix
frag.write('vec3 texn = ({0}) * 2.0 - 1.0;'.format(parse_vector_input(inp)))
frag.add_include('../../Shaders/std/normals.glsl')
frag.write('mat3 TBN = cotangentFrame(n, -vVec, texCoord);')
frag.write('n = TBN * normalize(texn);')
parse_teximage_vector = True
frag.write_pre = False

View file

@ -68,6 +68,7 @@ def make_rect(con_rect):
frag.add_uniform('sampler2D senvmapBrdf', link='_envmapBrdf')
frag.add_uniform('int envmapNumMipmaps', link='_envmapNumMipmaps')
frag.write_pre = True
frag.write('vec4 g0 = texture(gbuffer0, texCoordRect);')
frag.write('vec4 g1 = texture(gbuffer1, texCoordRect);')
frag.write('vec4 g2 = texture(gbuffer2, texCoordRect);')
@ -78,16 +79,17 @@ def make_rect(con_rect):
frag.write('n.xy = n.z >= 0.0 ? g0.xy : octahedronWrap(g0.xy);')
frag.write('n = normalize(n);')
frag.write('vec2 texCoord = g0.zw;');
frag.write('vec3 wposition = getPos(eye, eyeLook, viewRay, depth);')
frag.write('vec3 v = normalize(eye - wposition);')
frag.write('float dotNV = dot(n, v);')
frag.write('vec3 vVec = normalize(eye - wposition);')
frag.write_pre = False
frag.write('float dotNV = dot(n, vVec);')
frag.write('vec3 lp = lightPos - wposition;')
frag.write('vec3 l = normalize(lp);')
frag.write('float dotNL = max(dot(n, l), 0.0);')
frag.write('vec3 h = normalize(v + l);')
frag.write('vec3 h = normalize(vVec + l);')
frag.write('float dotNH = dot(n, h);')
frag.write('float dotVH = dot(v, h);')
frag.write('float dotVH = dot(vVec, h);')
frag.write('float visibility = 1.0;')
frag.write('vec3 basecol;')
@ -117,7 +119,7 @@ def make_rect(con_rect):
frag.write('vec2 envBRDF = texture(senvmapBrdf, vec2(roughness, 1.0 - dotNV)).xy;')
frag.write('vec3 envl = shIrradiance(n, 2.2) / PI;')
frag.write('vec3 reflectionWorld = reflect(-v, n);')
frag.write('vec3 reflectionWorld = reflect(-vVec, n);')
frag.write('float lod = getMipFromRoughness(roughness, envmapNumMipmaps);')
frag.write('vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(reflectionWorld), lod).rgb;')

Binary file not shown.

Binary file not shown.