Deferred for new mat builder

This commit is contained in:
Lubos Lenco 2016-12-15 14:28:22 +01:00
parent 002ded75c8
commit b22b0cfd36
4 changed files with 63 additions and 31 deletions

View file

@ -3,6 +3,7 @@ import os
import exporter
from material.shader_data import ShaderData
import material.make_forward as make_forward
import material.make_deferred as make_deferred
import material.state as state
def parse(self, material, mat_context, defs):
@ -23,7 +24,7 @@ def parse(self, material, mat_context, defs):
if rid == 'forward':
parse_forward()
elif rid == 'deferred':
parse_deferred
parse_deferred()
# TODO: Merge finalize shader here..
armutils.write_arm(state.path + '/' + material.name + '_data.arm', state.data.get())

View file

@ -147,6 +147,9 @@ def node_name(s):
s = armutils.safe_source_name(parents[-1].name) + '_' + s
return s
def socket_name(s):
return armutils.safe_source_name(s)
def parse(nodes, vert, frag):
output_node = node_by_type(nodes, 'OUTPUT_MATERIAL')
if output_node != None:
@ -313,6 +316,22 @@ def parse_shader(node, socket):
return out_basecol, out_roughness, out_metallic, out_occlusion
def write_result(l):
res_var = node_name(l.from_node.name) + '_' + socket_name(l.from_socket.name) + '_res'
st = l.from_socket.type
if res_var not in parsed:
parsed.append(res_var)
if st == 'RGB' or st == 'RGBA':
res = parse_rgb(l.from_node, l.from_socket)
frag.write('vec3 {0} = {1};'.format(res_var, res))
elif st == 'VECTOR':
res = parse_vector(l.from_node, l.from_socket)
frag.write('vec3 {0} = {1};'.format(res_var, res))
elif st == 'VALUE':
res = parse_value(l.from_node, l.from_socket)
frag.write('float {0} = {1};'.format(res_var, res))
return res_var
def parse_vector_input(inp):
if inp.is_linked:
l = inp.links[0]
@ -320,17 +339,12 @@ def parse_vector_input(inp):
if l.from_node.type == 'REROUTE':
return parse_vector_input(l.from_node.inputs[0])
res_var = node_name(l.from_node.name) + '_res'
if res_var not in parsed:
parsed.append(res_var)
if l.from_socket.type == 'RGB' or l.from_socket.type == 'RGBA':
res = parse_rgb(l.from_node, l.from_socket)
elif l.from_socket.type == 'VECTOR':
res = parse_vector(l.from_node, l.from_socket)
elif l.from_socket.type == 'VALUE':
res = 'vec3({0})'.format(parse_value(l.from_node, l.from_socket))
frag.write('vec3 {0} = {1};'.format(res_var, res))
return res_var
res_var = write_result(l)
st = l.from_socket.type
if st == 'RGB' or st == 'RGBA' or st == 'VECTOR':
return res_var
else: # VALUE
return 'vec3({0})'.format(res_var)
else:
if inp.type == 'VALUE': # Unlinked reroute
return tovec3([0.0, 0.0, 0.0])
@ -549,11 +563,11 @@ def parse_rgb(node, socket):
return tovec3(elems[0].color)
if interp == 'CONSTANT':
fac_var = node_name(node.name) + '_fac'
frag.write('float {0} = 1.0 - {1};'.format(fac_var, fac))
frag.write('float {0} = {1};'.format(fac_var, fac))
# Get index
out_i = '0'
for i in range(1, len(elems)):
out_i += ' + ({0} > {1} ? 0 : 1)'.format(fac_var, elems[i].position)
out_i += ' + ({0} > {1} ? 1 : 0)'.format(fac_var, elems[i].position)
# Write cols array
cols_var = node_name(node.name) + '_cols'
frag.write('vec3 {0}[{1}];'.format(cols_var, len(elems)))
@ -618,7 +632,6 @@ def parse_vector(node, socket):
elif socket == node.outputs[3]: # True Normal
return 'n'
elif socket == node.outputs[4]: # Incoming
trace('asdasdasd')
return 'v'
elif socket == node.outputs[5]: # Parametric
return 'wposition'
@ -731,17 +744,12 @@ def parse_value_input(inp):
if l.from_node.type == 'REROUTE':
return parse_value_input(l.from_node.inputs[0])
res_var = node_name(l.from_node.name) + '_res'
if res_var not in parsed:
parsed.append(res_var)
if l.from_socket.type == 'VALUE':
res = parse_value(l.from_node, l.from_socket)
elif l.from_socket.type == 'RGB' or l.from_socket.type == 'RGBA':
res = '{0}.x'.format(parse_rgb(l.from_node, l.from_socket))
elif l.from_socket.type == 'VECTOR':
res = '{0}.x'.format(parse_vector(l.from_node, l.from_socket))
frag.write('float {0} = {1};'.format(res_var, res))
return res_var
res_var = write_result(l)
st = l.from_socket.type
if st == 'RGB' or st == 'RGBA' or st == 'VECTOR':
return '{0}.x'.format(res_var)
else: # VALUE
return res_var
else:
return tovec1(inp.default_value)
@ -853,7 +861,7 @@ def parse_value(node, socket):
col1 = parse_vector_input(node.inputs[1])
col2 = parse_vector_input(node.inputs[2])
scale = parse_value_input(node.inputs[3])
return 'tex_checker({0}, {0}, {1}, {2}).r'.format(co, col1, col2, scale)
return 'tex_checker({0}, {1}, {2}, {3}).r'.format(co, col1, col2, scale)
elif node.type == 'TEX_GRADIENT':
return '0.0'

View file

@ -5,7 +5,7 @@ def mesh(context_id):
con_mesh = state.data.add_context({ 'name': context_id, 'depth_write': True, 'compare_mode': 'less', 'cull_mode': 'clockwise' })
vert = con_mesh.make_vert()
frag = con_mesh.make_frag()
frag = con_mesh.make_frag(mrt=2)
vert.add_out('vec3 wnormal')
vert.add_out('vec3 wposition')
@ -20,7 +20,27 @@ def mesh(context_id):
vert.write('eyeDir = eye - wposition;')
vert.write('gl_Position = WVP * spos;')
# make_cycles.parse(state.nodes, vert, frag)
frag.add_include('../../Shaders/compiled.glsl')
frag.add_include('../../Shaders/std/gbuffer.glsl')
frag.add_uniform('sampler2D snoise', link='_noise64')
frag.add_uniform('int lightType', '_lampType')
frag.write('vec3 n = normalize(wnormal);')
frag.write('vec3 v = normalize(eyeDir);')
# frag.write('float dotNV = dot(n, v);')
frag.write('float dotNV = max(dot(n, v), 0.0);')
frag.write('vec3 basecol;')
frag.write('float roughness;')
frag.write('float metallic;')
frag.write('float occlusion;')
make_cycles.parse(state.nodes, vert, frag)
# Pack normal
frag.write('n /= (abs(n.x) + abs(n.y) + abs(n.z));')
frag.write('n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);')
frag.write('fragColor[0] = vec4(n.xy, packFloat(metallic, roughness), 1.0 - gl_FragCoord.z);')
frag.write('fragColor[1] = vec4(basecol.rgb, occlusion);')
return con_mesh

View file

@ -83,11 +83,14 @@ class ShaderContext:
self.vert.add_in('vec' + str(e['size']) + ' ' + e['name'])
return self.vert
def make_frag(self):
def make_frag(self, mrt=1):
self.data['fragment_shader'] = self.material.name + '_' + self.data['name'] + '.frag'
self.frag = Shader(self)
self.frag.ins = self.vert.outs
self.frag.add_out('vec4 fragColor')
if mrt > 1:
self.frag.add_out('vec4[{0}] fragColor'.format(mrt))
else:
self.frag.add_out('vec4 fragColor')
return self.frag
def make_geom(self):