Fix usage of normals in shaders

This commit is contained in:
Moritz Brückner 2020-11-12 20:09:25 +01:00
parent aa9a93b530
commit b49bd54901
4 changed files with 21 additions and 21 deletions

View file

@ -365,7 +365,7 @@ def parse_normal_map_color_input(inp, strength_input=None):
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 = ({0}) * 2.0 - 1.0;'.format(parse_vector_input(inp)))
if strength_input is not None:
strength = parse_value_input(strength_input)
if strength != '1.0':

View file

@ -1,9 +1,11 @@
import arm.material.cycles as cycles
import arm.material.mat_state as mat_state
import arm.material.make_skin as make_skin
import arm.material.make_particle as make_particle
import arm.material.make_inst as make_inst
import arm.material.shader as shader
import arm.utils
import arm.material.cycles as cycles
def write_vertpos(vert):
billboard = mat_state.material.arm_billboard
@ -30,7 +32,8 @@ def write_vertpos(vert):
vert.add_uniform('mat4 WVP', '_worldViewProjectionMatrix')
vert.write('gl_Position = WVP * spos;')
def write_norpos(con_mesh, vert, declare=False, write_nor=True):
def write_norpos(con_mesh: shader.ShaderContext, vert: shader.Shader, declare=False, write_nor=True):
prep = ''
if declare:
prep = 'vec3 '
@ -42,7 +45,7 @@ def write_norpos(con_mesh, vert, declare=False, write_nor=True):
if is_bone:
make_skin.skin_nor(vert, prep)
else:
vert.write(prep + 'wnormal = normalize(N * vec3(nor.xy, pos.w));')
vert.write_attrib(prep + 'wnormal = normalize(N * vec3(nor.xy, pos.w));')
if con_mesh.is_elem('ipos'):
make_inst.inst_pos(con_mesh, vert)
vert.write_pre = False

View file

@ -89,7 +89,7 @@ def make(context_id, rpasses, shadowmap=False):
vert.add_out('vec3 wnormal')
vert.add_uniform('mat3 N', '_normalMatrix')
vert.write('wnormal = normalize(N * vec3(nor.xy, pos.w));')
make_tess.tesc_levels(tesc, rpdat.arm_tess_shadows_inner, rpdat.arm_tess_shadows_outer)
make_tess.interpolate(tese, 'wposition', 3)
make_tess.interpolate(tese, 'wnormal', 3, normalize=True)

View file

@ -140,7 +140,7 @@ def make_base(con_mesh, parse_opacity):
else:
vert.write_attrib('texCoord = tex * texUnpack;')
if tese != None:
if tese is not None:
tese.write_pre = True
make_tess.interpolate(tese, 'texCoord', 2, declare_out=frag.contains('texCoord'))
tese.write_pre = False
@ -149,7 +149,7 @@ def make_base(con_mesh, parse_opacity):
vert.add_out('vec2 texCoord1')
vert.add_uniform('float texUnpack', link='_texUnpack')
vert.write_attrib('texCoord1 = tex1 * texUnpack;')
if tese != None:
if tese is not None:
tese.write_pre = True
make_tess.interpolate(tese, 'texCoord1', 2, declare_out=frag.contains('texCoord1'))
tese.write_pre = False
@ -157,28 +157,25 @@ def make_base(con_mesh, parse_opacity):
if con_mesh.is_elem('col'):
vert.add_out('vec3 vcolor')
vert.write_attrib('vcolor = col.rgb;')
if tese != None:
if tese is not None:
tese.write_pre = True
make_tess.interpolate(tese, 'vcolor', 3, declare_out=frag.contains('vcolor'))
tese.write_pre = False
vert.add_out('vec3 wnormal')
make_attrib.write_norpos(con_mesh, vert)
frag.write_attrib('vec3 n = normalize(wnormal);')
if con_mesh.is_elem('tang'):
if tese != None:
vert.add_out('vec3 wnormal')
make_attrib.write_norpos(con_mesh, vert)
if tese is not None:
tese.add_out('mat3 TBN')
tese.write('vec3 wbitangent = normalize(cross(wnormal, wtangent));')
tese.write('TBN = mat3(wtangent, wbitangent, wnormal);')
tese.write_attrib('vec3 wbitangent = normalize(cross(wnormal, wtangent));')
tese.write_attrib('TBN = mat3(wtangent, wbitangent, wnormal);')
else:
vert.add_out('mat3 TBN')
make_attrib.write_norpos(con_mesh, vert, declare=True)
vert.write('vec3 tangent = normalize(N * tang.xyz);')
vert.write('vec3 bitangent = normalize(cross(wnormal, tangent));')
vert.write('TBN = mat3(tangent, bitangent, wnormal);')
else:
vert.add_out('vec3 wnormal')
make_attrib.write_norpos(con_mesh, vert)
frag.write_attrib('vec3 n = normalize(wnormal);')
vert.write_attrib('vec3 tangent = normalize(N * tang.xyz);')
vert.write_attrib('vec3 bitangent = normalize(cross(wnormal, tangent));')
vert.write_attrib('TBN = mat3(tangent, bitangent, wnormal);')
if is_displacement:
if rpdat.arm_rp_displacement == 'Vertex':