Normal maps for deferred+
This commit is contained in:
parent
fc81c6af6c
commit
391fea23d2
|
@ -106,11 +106,6 @@
|
|||
"link": "_lampSizeUV",
|
||||
"ifdef": ["_PCSS"]
|
||||
},
|
||||
{
|
||||
"name": "senvmapBrdf",
|
||||
"link": "_envmapBrdf",
|
||||
"ifdef": ["_VoxelGI"]
|
||||
},
|
||||
{
|
||||
"name": "VP",
|
||||
"link": "_viewProjectionMatrix",
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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.
Loading…
Reference in a new issue