Reduce shader count

This commit is contained in:
Lubos Lenco 2017-12-20 15:37:58 +01:00
parent 0ec80ebeff
commit 42b4185187
43 changed files with 175 additions and 210 deletions

View File

@ -11,10 +11,8 @@
"color_write_alpha": false,
"links": [],
"texture_params": [],
"vertex_shader": "blend_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"fragment_shader": "blend_pass.frag.glsl",
"fragment_shader_path": "../include/pass.frag.glsl"
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "../include/pass_copy.frag.glsl"
}
]
}

View File

@ -13,8 +13,7 @@
}
],
"texture_params": [],
"vertex_shader": "bloom_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "bloom_pass.frag.glsl"
}
]

View File

@ -13,8 +13,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_adaptive_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_adaptive_pass.frag.glsl"
},
{
@ -30,8 +29,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_adaptive_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_adaptive_pass.frag.glsl"
},
@ -49,8 +47,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_adaptive_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_adaptive_pass.frag.glsl"
},
{
@ -66,8 +63,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_adaptive_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_adaptive_pass.frag.glsl"
},
{
@ -86,8 +82,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_adaptive_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_adaptive_pass.frag.glsl"
}
]

View File

@ -13,8 +13,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_edge_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_edge_pass.frag.glsl"
},
{
@ -30,8 +29,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_edge_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_edge_pass.frag.glsl"
},
{
@ -50,8 +48,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_edge_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_edge_pass.frag.glsl"
},
@ -74,8 +71,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_edge_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_edge_pass.frag.glsl"
}
]

View File

@ -17,8 +17,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_gaus_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_gaus_pass.frag.glsl"
},
{
@ -38,8 +37,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_gaus_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_gaus_pass.frag.glsl"
},
{
@ -62,8 +60,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_gaus_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_gaus_pass.frag.glsl"
}
]

View File

@ -13,8 +13,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_pass.frag.glsl"
},
{
@ -30,8 +29,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_pass.frag.glsl"
},
@ -49,8 +47,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_pass.frag.glsl"
},
{
@ -66,8 +63,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_pass.frag.glsl"
}
]

View File

@ -13,8 +13,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_shadow_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_shadow_pass.frag.glsl"
},
{
@ -30,8 +29,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_shadow_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_shadow_pass.frag.glsl"
},
{
@ -50,8 +48,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_shadow_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_shadow_pass.frag.glsl"
},
@ -74,8 +71,7 @@
}
],
"texture_params": [],
"vertex_shader": "blur_shadow_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "blur_shadow_pass.frag.glsl"
}
]

View File

@ -8,8 +8,7 @@
"cull_mode": "none",
"links": [],
"texture_params": [],
"vertex_shader": "combine_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "combine_pass.frag.glsl"
}
]

View File

@ -7,10 +7,8 @@
"cull_mode": "none",
"links": [],
"texture_params": [],
"vertex_shader": "copy_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"fragment_shader": "copy_pass.frag.glsl",
"fragment_shader_path": "../include/pass.frag.glsl"
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "../include/pass_copy.frag.glsl"
}
]
}

View File

@ -21,8 +21,7 @@
}
],
"texture_params": [],
"vertex_shader": "debug_normals.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "debug_normals.frag.glsl"
}
]

View File

@ -8,8 +8,7 @@
"cull_mode": "none",
"links": [],
"texture_params": [],
"vertex_shader": "debug_velocity.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "debug_velocity.frag.glsl"
}
]

View File

@ -117,8 +117,7 @@
"ifdef": ["_DFRS"]
}
],
"vertex_shader": "deferred_light.vert.glsl",
"vertex_shader_path": "../include/lamp_volume.vert.glsl",
"vertex_shader": "../include/pass_lamp_volume.vert.glsl",
"fragment_shader": "deferred_light.frag.glsl"
}
]

View File

@ -86,8 +86,7 @@
"link": "_cameraPlaneProj"
}
],
"vertex_shader": "deferred_light_quad.vert.glsl",
"vertex_shader_path": "../include/pass_viewray.vert.glsl",
"vertex_shader": "../include/pass_viewray.vert.glsl",
"fragment_shader": "deferred_light_quad.frag.glsl"
}
]

View File

@ -12,8 +12,7 @@
}
],
"texture_params": [],
"vertex_shader": "dilate_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "dilate_pass.frag.glsl"
},
{
@ -28,8 +27,7 @@
}
],
"texture_params": [],
"vertex_shader": "dilate_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "dilate_pass.frag.glsl"
}
]

View File

@ -13,8 +13,7 @@
}
],
"texture_params": [],
"vertex_shader": "fxaa_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "fxaa_pass.frag.glsl"
}
]

View File

@ -34,8 +34,7 @@
],
"texture_params": [],
"vertex_shader": "grease_pencil_shadows.vert.glsl",
"fragment_shader": "grease_pencil_shadows.frag.glsl",
"fragment_shader_path": "../include/empty.frag.glsl"
"fragment_shader": "../include/empty.frag.glsl"
}
]
}

View File

@ -1,7 +0,0 @@
#version 450
out vec4 fragColor;
void main() {
}

View File

@ -11,8 +11,7 @@
"cull_mode": "none",
"links": [],
"texture_params": [],
"vertex_shader": "matid_to_depth.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "matid_to_depth.frag.glsl"
}
]

View File

@ -29,8 +29,7 @@
}
],
"texture_params": [],
"vertex_shader": "motion_blur_pass.vert.glsl",
"vertex_shader_path": "../include/pass_viewray.vert.glsl",
"vertex_shader": "../include/pass_viewray.vert.glsl",
"fragment_shader": "motion_blur_pass.frag.glsl"
}
]

View File

@ -14,8 +14,7 @@
}
],
"texture_params": [],
"vertex_shader": "motion_blur_veloc_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "motion_blur_veloc_pass.frag.glsl"
}
]

View File

@ -36,8 +36,7 @@
}
],
"texture_params": [],
"vertex_shader": "ssao_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "ssao_pass.frag.glsl"
}
]

View File

@ -13,8 +13,7 @@
}
],
"texture_params": [],
"vertex_shader": "ssgi_blur_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "ssgi_blur_pass.frag.glsl"
},
{
@ -30,8 +29,7 @@
}
],
"texture_params": [],
"vertex_shader": "ssgi_blur_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "ssgi_blur_pass.frag.glsl"
},
{
@ -50,8 +48,7 @@
}
],
"texture_params": [],
"vertex_shader": "ssgi_blur_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "ssgi_blur_pass.frag.glsl"
},
@ -74,8 +71,7 @@
}
],
"texture_params": [],
"vertex_shader": "ssgi_blur_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "ssgi_blur_pass.frag.glsl"
}
]

View File

@ -24,8 +24,7 @@
}
],
"texture_params": [],
"vertex_shader": "ssgi_pass.vert.glsl",
"vertex_shader_path": "../include/pass_viewray2.vert.glsl",
"vertex_shader": "../include/pass_viewray2.vert.glsl",
"fragment_shader": "ssgi_pass.frag.glsl"
}
]

View File

@ -25,8 +25,7 @@
}
],
"texture_params": [],
"vertex_shader": "ssr_pass.vert.glsl",
"vertex_shader_path": "../include/pass_viewray2.vert.glsl",
"vertex_shader": "../include/pass_viewray2.vert.glsl",
"fragment_shader": "ssr_pass.frag.glsl"
}
]

View File

@ -16,8 +16,7 @@
}
],
"texture_params": [],
"vertex_shader": "sss_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "sss_pass.frag.glsl"
},
{
@ -36,8 +35,7 @@
}
],
"texture_params": [],
"vertex_shader": "sss_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "sss_pass.frag.glsl"
}
]

View File

@ -13,8 +13,7 @@
}
],
"texture_params": [],
"vertex_shader": "supersample_resolve.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "supersample_resolve.frag.glsl"
}
]

View File

@ -7,8 +7,7 @@
"cull_mode": "none",
"links": [],
"texture_params": [],
"vertex_shader": "taa_pass.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "taa_pass.frag.glsl"
}
]

View File

@ -12,8 +12,7 @@
"alpha_blend_destination": "inverse_source_alpha",
"alpha_blend_operation": "add",
"links": [],
"vertex_shader": "translucent_resolve.vert.glsl",
"vertex_shader_path": "../include/pass.vert.glsl",
"vertex_shader": "../include/pass.vert.glsl",
"fragment_shader": "translucent_resolve.frag.glsl"
}
]

View File

@ -56,8 +56,7 @@
}
],
"texture_params": [],
"vertex_shader": "volumetric_light.vert.glsl",
"vertex_shader_path": "../include/lamp_volume.vert.glsl",
"vertex_shader": "../include/pass_lamp_volume.vert.glsl",
"fragment_shader": "volumetric_light.frag.glsl"
}
]

View File

@ -54,8 +54,7 @@
}
],
"texture_params": [],
"vertex_shader": "volumetric_light_quad.vert.glsl",
"vertex_shader_path": "../include/pass_viewray.vert.glsl",
"vertex_shader": "../include/pass_viewray.vert.glsl",
"fragment_shader": "volumetric_light_quad.frag.glsl"
}
]

View File

@ -13,6 +13,8 @@ shaders = []
shaders_last = []
shader_datas = []
shader_passes = []
shader_passes_assets = {}
shader_cons = {}
def reset():
global assets
@ -22,6 +24,7 @@ def reset():
global shaders
global shaders_last
global shader_datas
global shader_cons
assets = []
khafile_defs_last = khafile_defs
khafile_defs = []
@ -30,6 +33,13 @@ def reset():
shaders = []
shader_datas = []
shader_passes = []
shader_cons = {}
shader_cons['mesh_vert'] = []
shader_cons['depth_vert'] = []
shader_cons['depth_frag'] = []
shader_cons['voxel_vert'] = []
shader_cons['voxel_frag'] = []
shader_cons['voxel_geom'] = []
def add(file):
global assets
@ -67,9 +77,6 @@ def add_shader_pass(data_name):
add_shader_data(arm.utils.build_dir() + '/compiled/Shaders/shader_datas.arm')
if data_name not in shader_passes:
shader_passes.append(data_name)
full_name = arm.utils.build_dir() + '/compiled/Shaders/' + data_name
add_shader(full_name + '.vert.glsl')
add_shader(full_name + '.frag.glsl')
invalidate_enabled = True # Disable invalidating during build process
@ -115,3 +122,27 @@ def invalidate_envmap_data(self, context):
fp = arm.utils.get_fp_build()
if os.path.isdir(fp + '/compiled/Assets/envmaps'):
shutil.rmtree(fp + '/compiled/Assets/envmaps', onerror=remove_readonly)
def shader_equal(sh, ar, shtype):
# Merge equal shaders
for e in ar:
if sh.is_equal(e):
sh.context.data[shtype] = e.context.data[shtype]
sh.is_linked = True
return
ar.append(sh)
def vs_equal(c, ar):
shader_equal(c.vert, ar, 'vertex_shader')
def fs_equal(c, ar):
shader_equal(c.frag, ar, 'fragment_shader')
def gs_equal(c, ar):
shader_equal(c.geom, ar, 'geometry_shader')
def tcs_equal(c, ar):
shader_equal(c.tesc, ar, 'tesscontrol_shader')
def tes_equal(c, ar):
shader_equal(c.tese, ar, 'tesseval_shader')

View File

@ -1,5 +1,6 @@
import os
import arm.utils
import arm.assets as assets
def write_data(res, defs, json_data, base_name):
# Define
@ -11,6 +12,8 @@ def write_data(res, defs, json_data, base_name):
sres['name'] = shader_id
sres['contexts'] = []
asset = assets.shader_passes_assets[base_name]
# Parse
for c in json_data['contexts']:
con = {}
@ -21,23 +24,28 @@ def write_data(res, defs, json_data, base_name):
con['vertex_structure'] = []
# Names
vert_name = c['vertex_shader'].split('.')[0]
frag_name = c['fragment_shader'].split('.')[0]
if 'geometry_shader' in c:
geom_name = c['geometry_shader'].split('.')[0]
if 'tesscontrol_shader' in c:
tesc_name = c['tesscontrol_shader'].split('.')[0]
if 'tesseval_shader' in c:
tese_name = c['tesseval_shader'].split('.')[0]
con['vertex_shader'] = c['vertex_shader'].rsplit('.', 1)[0].split('/')[-1]
if con['vertex_shader'] not in asset:
asset.append(con['vertex_shader'])
con['fragment_shader'] = c['fragment_shader'].rsplit('.', 1)[0].split('/')[-1]
if con['fragment_shader'] not in asset:
asset.append(con['fragment_shader'])
con['vertex_shader'] = vert_name + '.vert'
con['fragment_shader'] = frag_name + '.frag'
if 'geometry_shader' in c:
con['geometry_shader'] = geom_name + '.geom'
con['geometry_shader'] = c['geometry_shader'].rsplit('.', 1)[0].split('/')[-1]
if con['geometry_shader'] not in asset:
asset.append(con['geometry_shader'])
if 'tesscontrol_shader' in c:
con['tesscontrol_shader'] = tesc_name + '.tesc'
con['tesscontrol_shader'] = c['tesscontrol_shader'].rsplit('.', 1)[0].split('/')[-1]
if con['tesscontrol_shader'] not in asset:
asset.append(con['tesscontrol_shader'])
if 'tesseval_shader' in c:
con['tesseval_shader'] = tese_name + '.tese'
con['tesseval_shader'] = c['tesseval_shader'].rsplit('.', 1)[0].split('/')[-1]
if con['tesseval_shader'] not in asset:
asset.append(con['tesseval_shader'])
# Params
params = ['depth_write', 'compare_mode', 'stencil_mode', \
@ -53,48 +61,28 @@ def write_data(res, defs, json_data, base_name):
con[p] = c[p]
# Parse shaders
if 'vertex_shader_path' in c:
with open(c['vertex_shader_path']) as f:
vert = f.read().splitlines()
else:
with open(c['vertex_shader']) as f:
vert = f.read().splitlines()
with open(c['vertex_shader']) as f:
vert = f.read().splitlines()
if 'fragment_shader_path' in c:
with open(c['fragment_shader_path']) as f:
frag = f.read().splitlines()
else:
with open(c['fragment_shader']) as f:
frag = f.read().splitlines()
with open(c['fragment_shader']) as f:
frag = f.read().splitlines()
parse_shader(sres, c, con, defs, vert, True) # Parse attribs for vertex shader
parse_shader(sres, c, con, defs, frag, False)
if 'geometry_shader' in c:
if 'geometry_shader_path' in c:
with open(c['geometry_shader_path']) as f:
geom = f.read().splitlines()
else:
with open(c['geometry_shader']) as f:
geom = f.read().splitlines()
with open(c['geometry_shader']) as f:
geom = f.read().splitlines()
parse_shader(sres, c, con, defs, geom, False)
if 'tesscontrol_shader' in c:
if 'tesscontrol_shader_path' in c:
with open(c['tesscontrol_shader_path']) as f:
tesc = f.read().splitlines()
else:
with open(c['tesscontrol_shader']) as f:
tesc = f.read().splitlines()
with open(c['tesscontrol_shader']) as f:
tesc = f.read().splitlines()
parse_shader(sres, c, con, defs, tesc, False)
if 'tesseval_shader' in c:
if 'tesseval_shader_path' in c:
with open(c['tesseval_shader_path']) as f:
tese = f.read().splitlines()
else:
with open(c['tesseval_shader']) as f:
tese = f.read().splitlines()
with open(c['tesseval_shader']) as f:
tese = f.read().splitlines()
parse_shader(sres, c, con, defs, tese, False)
def parse_shader(sres, c, con, defs, lines, parse_attributes):

View File

@ -21,54 +21,34 @@ def make(base_name, json_data, fp, defs):
shaders.append(shader)
shader['vert_name'] = c['vertex_shader'].split('.', 1)[0]
if 'vertex_shader_path' in c:
with open(c['vertex_shader_path']) as f:
shader['vert'] = f.read().splitlines()
else:
with open(c['vertex_shader']) as f:
shader['vert'] = f.read().splitlines()
with open(c['vertex_shader']) as f:
shader['vert'] = f.read().splitlines()
shader['frag_name'] = c['fragment_shader'].split('.', 1)[0]
if 'fragment_shader_path' in c:
with open(c['fragment_shader_path']) as f:
shader['frag'] = f.read().splitlines()
else:
with open(c['fragment_shader']) as f:
shader['frag'] = f.read().splitlines()
with open(c['fragment_shader']) as f:
shader['frag'] = f.read().splitlines()
if 'geometry_shader' in c:
shader['geom_name'] = c['geometry_shader'].split('.', 1)[0]
if 'geometry_shader_path' in c:
with open(c['geometry_shader_path']) as f:
shader['geom'] = f.read().splitlines()
else:
with open(c['geometry_shader']) as f:
shader['geom'] = f.read().splitlines()
with open(c['geometry_shader']) as f:
shader['geom'] = f.read().splitlines()
if 'tesscontrol_shader' in c:
shader['tesc_name'] = c['tesscontrol_shader'].split('.', 1)[0]
if 'tesscontrol_shader_path' in c:
with open(c['tesscontrol_shader_path']) as f:
shader['tesc'] = f.read().splitlines()
else:
with open(c['tesscontrol_shader']) as f:
shader['tesc'] = f.read().splitlines()
with open(c['tesscontrol_shader']) as f:
shader['tesc'] = f.read().splitlines()
if 'tesseval_shader' in c:
shader['tese_name'] = c['tesseval_shader'].split('.', 1)[0]
if 'tesseval_shader_path' in c:
with open(c['tesseval_shader_path']) as f:
shader['tese'] = f.read().splitlines()
else:
with open(c['tesseval_shader']) as f:
shader['tese'] = f.read().splitlines()
with open(c['tesseval_shader']) as f:
shader['tese'] = f.read().splitlines()
for shader in shaders:
write_variant(path, shader['vert_name'] + '.vert.glsl', defs, shader['vert'])
write_variant(path, shader['frag_name'] + '.frag.glsl', defs, shader['frag'])
write_variant(path, c['vertex_shader'].split('/')[-1], defs, shader['vert'])
write_variant(path, c['fragment_shader'].split('/')[-1], defs, shader['frag'])
if 'geom' in shader:
write_variant(path, shader['geom_name'] + '.geom.glsl', defs, shader['geom'])
write_variant(path, c['geometry_shader'].split('/')[-1], defs, shader['geom'])
if 'tesc' in shader:
write_variant(path, shader['tesc_name'] + '.tesc.glsl', defs, shader['tesc'])
write_variant(path, c['tesscontrol_shader'].split('/')[-1], defs, shader['tesc'])
if 'tese' in shader:
write_variant(path, shader['tese_name'] + '.tese.glsl', defs, shader['tese'])
write_variant(path, c['tesseval_shader'].split('/')[-1], defs, shader['tese'])

View File

@ -37,14 +37,13 @@ def compile_shader_pass(res, raw_shaders_path, shader_name, defs):
# Open json file
json_name = shader_name + '.json'
base_name = json_name.split('.', 1)[0]
with open(json_name) as f:
json_file = f.read()
json_data = json.loads(json_file)
fp = arm.utils.get_fp_build()
arm.lib.make_datas.make(res, base_name, json_data, fp, defs)
arm.lib.make_variants.make(base_name, json_data, fp, defs)
arm.lib.make_datas.make(res, shader_name, json_data, fp, defs)
arm.lib.make_variants.make(shader_name, json_data, fp, defs)
def remove_readonly(func, path, excinfo):
os.chmod(path, stat.S_IWRITE)
@ -145,6 +144,7 @@ def export_data(fp, sdk_path, is_play=False, is_publish=False, in_viewport=False
print('Shader flags: ' + str(defs))
# Write referenced shader passes
path = build_dir + '/compiled/Shaders'
if not os.path.isfile(build_dir + '/compiled/Shaders/shader_datas.arm') or state.last_world_defs != wrd.world_defs:
path = build_dir + '/compiled/Shaders'
if not os.path.exists(path):
@ -155,6 +155,7 @@ def export_data(fp, sdk_path, is_play=False, is_publish=False, in_viewport=False
# Ensure shader pass source exists
if not os.path.exists(raw_shaders_path + '/' + ref):
continue
assets.shader_passes_assets[ref] = []
if ref.startswith('compositor_pass'):
cdefs = arm.utils.def_strings_to_array(wrd.compo_defs)
compile_shader_pass(res, raw_shaders_path, ref, defs + cdefs)
@ -163,6 +164,9 @@ def export_data(fp, sdk_path, is_play=False, is_publish=False, in_viewport=False
else:
compile_shader_pass(res, raw_shaders_path, ref, defs)
arm.utils.write_arm(path + '/shader_datas.arm', res)
for ref in assets.shader_passes:
for s in assets.shader_passes_assets[ref]:
assets.add_shader(path + '/' + s + '.glsl')
state.last_world_defs = wrd.world_defs
# Reset path

View File

@ -6,6 +6,7 @@ import arm.material.make_skin as make_skin
import arm.material.make_tess as make_tess
import arm.material.make_particle as make_particle
import arm.material.make_mesh as make_mesh
import arm.assets as assets
import arm.utils
def make(context_id, rpasses, shadowmap=False):
@ -24,9 +25,6 @@ def make(context_id, rpasses, shadowmap=False):
tesc = None
tese = None
gapi = arm.utils.get_gapi()
if gapi == 'direct3d9':
frag.add_out('vec4 fragColor') # Definition requred for d3d9 - pixel shader must minimally write all four components of COLOR0
vert.write_main_header('vec4 spos = vec4(pos, 1.0);')
parse_opacity = 'translucent' in rpasses or mat_state.material.arm_discard
@ -148,6 +146,7 @@ def make(context_id, rpasses, shadowmap=False):
con_depth.add_elem('tang', 4)
# TODO: pass vbuf with proper struct
gapi = arm.utils.get_gapi()
if gapi.startswith('direct3d') and bpy.data.worlds['Arm'].arm_deinterleaved_buffers == False:
vert.write('vec3 t1 = nor; // TODO: Temp for d3d')
if con_depth.is_elem('tex'):
@ -157,9 +156,9 @@ def make(context_id, rpasses, shadowmap=False):
opac = mat_state.material.arm_discard_opacity_shadows
frag.write('if (opacity < {0}) discard;'.format(opac))
# frag.write('fragColor = vec4(0.0);')
assets.vs_equal(con_depth, assets.shader_cons['depth_vert'])
assets.fs_equal(con_depth, assets.shader_cons['depth_frag'])
make_mesh.make_finalize(con_depth)
return con_depth

View File

@ -1,5 +1,5 @@
import bpy
import arm.make_state as state
import arm.assets as assets
import arm.material.mat_state as mat_state
import arm.material.mat_utils as mat_utils
import arm.material.cycles as cycles
@ -49,6 +49,8 @@ def make(context_id):
elif rid == 'Deferred Plus':
make_deferred_plus(con_mesh)
assets.vs_equal(con_mesh, assets.shader_cons['mesh_vert'])
make_finalize(con_mesh)
return con_mesh

View File

@ -21,7 +21,7 @@ def make_rect(con_rect):
vert = con_rect.make_vert()
frag = con_rect.make_frag()
vert.vertex_structure_as_vsinput = False # Rect structure is used instead
vert.vstruct_as_vsin = False # Rect structure is used instead
vert.add_in('vec2 pos')
vert.add_out('vec2 texCoordRect')

View File

@ -105,7 +105,7 @@ def write_shaders(rel_path, con, rpass, matname):
write_shader(rel_path, con.tese, 'tese', rpass, matname, keep_cache=keep_cache)
def write_shader(rel_path, shader, ext, rpass, matname, keep_cache=True):
if shader == None:
if shader == None or shader.is_linked:
return
# TODO: blend context

View File

@ -1,5 +1,6 @@
import bpy
import arm.utils
import arm.assets as assets
import arm.material.cycles as cycles
import arm.material.mat_state as mat_state
import arm.material.mat_utils as mat_utils
@ -8,9 +9,15 @@ import arm.material.make_particle as make_particle
def make(context_id):
rpdat = arm.utils.get_rp()
if rpdat.rp_gi == 'Voxel GI':
return make_gi(context_id)
con = make_gi(context_id)
else:
return make_ao(context_id)
con = make_ao(context_id)
assets.vs_equal(con, assets.shader_cons['voxel_vert'])
assets.gs_equal(con, assets.shader_cons['voxel_frag'])
assets.fs_equal(con, assets.shader_cons['voxel_geom'])
return con
def make_gi(context_id):
con_voxel = mat_state.data.add_context({ 'name': context_id, 'depth_write': False, 'compare_mode': 'always', 'cull_mode': 'none', 'color_write_red': False, 'color_write_green': False, 'color_write_blue': False, 'color_write_alpha': False, 'conservative_raster': True })

View File

@ -18,9 +18,10 @@ class Shader:
self.write_pre = False
self.write_pre_header = 0
self.tab = 1
self.vertex_structure_as_vsinput = True
self.vstruct_as_vsin = True
self.lock = False
self.geom_passthrough = False
self.is_linked = False # Use already generated shader
def add_include(self, s):
self.includes.append(s)
@ -82,6 +83,20 @@ class Shader:
def write_main_header(self, s):
self.main_header += s + '\n'
def is_equal(self, sh):
self.vstruct_to_vsin()
return self.ins == sh.ins and \
self.main == sh.main and \
self.main_header == sh.main_header and \
self.main_pre == sh.main_pre
def vstruct_to_vsin(self):
if self.shader_type != 'vert' or self.ins != [] or not self.vstruct_as_vsin: # Vertex structure as vertex shader input
return
vs = self.context.data['vertex_structure']
for e in vs:
self.add_in('vec' + str(e['size']) + ' ' + e['name'])
def get(self):
s = '#version 450\n'
@ -94,11 +109,9 @@ class Shader:
in_ext = ''
out_ext = ''
if self.shader_type == 'vert' and self.vertex_structure_as_vsinput: # Vertex structure as vertex shader input
vs = self.context.data['vertex_structure']
for e in vs:
self.add_in('vec' + str(e['size']) + ' ' + e['name'])
if self.shader_type == 'vert':
self.vstruct_to_vsin()
elif self.shader_type == 'tesc':
in_ext = '[]'
out_ext = '[]'

View File

@ -80,7 +80,6 @@ class ArmExporterListItem(bpy.types.PropertyGroup):
items = [('opengl', 'Auto', 'opengl'),
('opengl', 'OpenGL', 'opengl'),
('vulkan', 'Vulkan', 'vulkan'),
('direct3d9', 'Direct3D9', 'direct3d9'),
('direct3d11', 'Direct3D11', 'direct3d11'),
('direct3d12', 'Direct3D12', 'direct3d12')],
name="Graphics API", default='opengl', description='Based on currently selected target', update=update_gapi_win)