Begin renderer work
This commit is contained in:
parent
6f6ff24f12
commit
10442cf0ff
|
@ -27,9 +27,9 @@ class RenderPathCreator {
|
||||||
#elseif (rp_renderer == "Deferred")
|
#elseif (rp_renderer == "Deferred")
|
||||||
RenderPathDeferred.init(path);
|
RenderPathDeferred.init(path);
|
||||||
path.commands = RenderPathDeferred.commands;
|
path.commands = RenderPathDeferred.commands;
|
||||||
#elseif (rp_renderer == "Pathtracer")
|
#elseif (rp_renderer == "Raytracer")
|
||||||
RenderPathPathtracer.init(path);
|
RenderPathRaytracer.init(path);
|
||||||
path.commands = RenderPathPathtracer.commands;
|
path.commands = RenderPathRaytracer.commands;
|
||||||
#end
|
#end
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,9 +16,9 @@ import kha.graphics5.TextureFormat;
|
||||||
|
|
||||||
import iron.RenderPath;
|
import iron.RenderPath;
|
||||||
|
|
||||||
class RenderPathPathtracer {
|
class RenderPathRaytracer {
|
||||||
|
|
||||||
#if (rp_renderer == "Pathtracer")
|
#if (rp_renderer == "Raytracer")
|
||||||
|
|
||||||
static var path:RenderPath;
|
static var path:RenderPath;
|
||||||
static var ready = false;
|
static var ready = false;
|
|
@ -1111,17 +1111,9 @@ class Cycles {
|
||||||
frag.write_normal++;
|
frag.write_normal++;
|
||||||
parse_teximage_vector = false; // Force texCoord for normal map image vector
|
parse_teximage_vector = false; // Force texCoord for normal map image vector
|
||||||
out_normaltan = parse_vector_input(inp);
|
out_normaltan = parse_vector_input(inp);
|
||||||
// defplus = c_state.get_rp_renderer() == 'Deferred Plus'
|
|
||||||
// if not c_state.get_arm_export_tangents() or defplus: # Compute TBN matrix
|
|
||||||
if (!arm_export_tangents) {
|
if (!arm_export_tangents) {
|
||||||
|
|
||||||
frag.write('vec3 texn = ($out_normaltan) * 2.0 - 1.0;');
|
frag.write('vec3 texn = ($out_normaltan) * 2.0 - 1.0;');
|
||||||
frag.write('texn.y = -texn.y;');
|
frag.write('texn.y = -texn.y;');
|
||||||
// frag.add_include('../../Shaders/std/normals.glsl')
|
|
||||||
|
|
||||||
// if defplus:
|
|
||||||
// frag.write('mat3 TBN = cotangentFrame(n, -vVec, g2.xy, g2.zw);')
|
|
||||||
// else:
|
|
||||||
if (!cotangentFrameWritten) {
|
if (!cotangentFrameWritten) {
|
||||||
cotangentFrameWritten = true;
|
cotangentFrameWritten = true;
|
||||||
frag.add_function(CyclesFunctions.str_cotangentFrame);
|
frag.add_function(CyclesFunctions.str_cotangentFrame);
|
||||||
|
|
|
@ -240,7 +240,7 @@ def compile(assets_only=False):
|
||||||
cmd.append('--vr')
|
cmd.append('--vr')
|
||||||
cmd.append('webvr')
|
cmd.append('webvr')
|
||||||
|
|
||||||
if arm.utils.get_rp().rp_renderer == 'Pathtracer':
|
if arm.utils.get_rp().rp_renderer == 'Raytracer':
|
||||||
cmd.append('--raytrace')
|
cmd.append('--raytrace')
|
||||||
cmd.append('dxr')
|
cmd.append('dxr')
|
||||||
dxc_path = fp + '/HlslShaders/fxc.exe'
|
dxc_path = fp + '/HlslShaders/fxc.exe'
|
||||||
|
|
|
@ -895,15 +895,11 @@ def parse_normal_map_color_input(inp, strength_input=None):
|
||||||
return
|
return
|
||||||
normal_parsed = True
|
normal_parsed = True
|
||||||
frag.write_normal += 1
|
frag.write_normal += 1
|
||||||
defplus = get_rp_renderer() == 'Deferred Plus'
|
if not get_arm_export_tangents() or mat_get_material().arm_decal: # Compute TBN matrix
|
||||||
if not get_arm_export_tangents() or defplus or mat_get_material().arm_decal: # Compute TBN matrix
|
|
||||||
frag.write('vec3 texn = ({0}) * 2.0 - 1.0;'.format(parse_vector_input(inp)))
|
frag.write('vec3 texn = ({0}) * 2.0 - 1.0;'.format(parse_vector_input(inp)))
|
||||||
frag.write('texn.y = -texn.y;')
|
frag.write('texn.y = -texn.y;')
|
||||||
frag.add_include('std/normals.glsl')
|
frag.add_include('std/normals.glsl')
|
||||||
if defplus:
|
frag.write('mat3 TBN = cotangentFrame(n, -vVec, texCoord);')
|
||||||
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);')
|
frag.write('n = TBN * normalize(texn);')
|
||||||
else:
|
else:
|
||||||
frag.write('vec3 n = ({0}) * 2.0 - 1.0;'.format(parse_vector_input(inp)))
|
frag.write('vec3 n = ({0}) * 2.0 - 1.0;'.format(parse_vector_input(inp)))
|
||||||
|
|
|
@ -53,10 +53,8 @@ def make(context_id):
|
||||||
make_forward(con_mesh)
|
make_forward(con_mesh)
|
||||||
elif rid == 'Deferred':
|
elif rid == 'Deferred':
|
||||||
make_deferred(con_mesh)
|
make_deferred(con_mesh)
|
||||||
# elif rid == 'Deferred Plus':
|
elif rid == 'Raytracer':
|
||||||
# make_deferred_plus(con_mesh)
|
make_raytracer(con_mesh)
|
||||||
elif rid == 'Pathtracer':
|
|
||||||
make_pathtracer(con_mesh)
|
|
||||||
|
|
||||||
make_finalize(con_mesh)
|
make_finalize(con_mesh)
|
||||||
|
|
||||||
|
@ -406,45 +404,7 @@ def make_deferred(con_mesh):
|
||||||
|
|
||||||
return con_mesh
|
return con_mesh
|
||||||
|
|
||||||
# def make_deferred_plus(con_mesh):
|
def make_raytracer(con_mesh):
|
||||||
# vert = con_mesh.make_vert()
|
|
||||||
# frag = con_mesh.make_frag()
|
|
||||||
|
|
||||||
# frag.add_out('vec4[3] fragColor')
|
|
||||||
|
|
||||||
# vert.add_uniform('mat3 N', '_normalMatrix')
|
|
||||||
# vert.write_attrib('vec4 spos = vec4(pos, 1.0);')
|
|
||||||
|
|
||||||
# frag.ins = vert.outs
|
|
||||||
# vert.add_uniform('mat4 WVP', '_worldViewProjectionMatrix')
|
|
||||||
# vert.write('gl_Position = WVP * spos;')
|
|
||||||
|
|
||||||
# frag.add_include('compiled.inc')
|
|
||||||
|
|
||||||
# vert.add_out('vec2 texCoord')
|
|
||||||
|
|
||||||
# con_mesh.add_elem('tex', 2) #### Add using cycles.py
|
|
||||||
# if con_mesh.is_elem('tex'):
|
|
||||||
# vert.write_attrib('texCoord = tex;')
|
|
||||||
# else:
|
|
||||||
# vert.write_attrib('texCoord = vec2(0.0);')
|
|
||||||
|
|
||||||
# vert.add_out('vec3 wnormal')
|
|
||||||
# write_norpos(con_mesh, vert)
|
|
||||||
# frag.write_attrib('vec3 n = normalize(wnormal);')
|
|
||||||
|
|
||||||
# frag.add_uniform('float materialID', link='_objectInfoMaterialIndex')
|
|
||||||
|
|
||||||
# # Pack gbuffer
|
|
||||||
# frag.add_include('std/gbuffer.glsl')
|
|
||||||
# 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, fract(texCoord));')
|
|
||||||
# frag.write('fragColor[1] = vec4(materialID, 0.0, 0.0, 0.0);')
|
|
||||||
# frag.write('fragColor[2] = vec4(dFdx(texCoord), dFdy(texCoord));')
|
|
||||||
# # + tangent space
|
|
||||||
|
|
||||||
def make_pathtracer(con_mesh):
|
|
||||||
wrd = bpy.data.worlds['Arm']
|
wrd = bpy.data.worlds['Arm']
|
||||||
vert = con_mesh.make_vert()
|
vert = con_mesh.make_vert()
|
||||||
frag = con_mesh.make_frag()
|
frag = con_mesh.make_frag()
|
||||||
|
|
|
@ -1,140 +0,0 @@
|
||||||
import bpy
|
|
||||||
import arm.make_state as state
|
|
||||||
import arm.material.mat_state as mat_state
|
|
||||||
import arm.material.mat_utils as mat_utils
|
|
||||||
import arm.material.cycles as cycles
|
|
||||||
import arm.material.make_skin as make_skin
|
|
||||||
import arm.material.make_tess as make_tess
|
|
||||||
import arm.utils
|
|
||||||
|
|
||||||
is_displacement = False
|
|
||||||
|
|
||||||
def make(context_id):
|
|
||||||
con_rect = mat_state.data.add_context({ 'name': context_id, 'depth_write': False, 'compare_mode': 'equal', 'cull_mode': 'none' })
|
|
||||||
|
|
||||||
make_rect(con_rect)
|
|
||||||
|
|
||||||
return con_rect
|
|
||||||
|
|
||||||
def make_rect(con_rect):
|
|
||||||
wrd = bpy.data.worlds['Arm']
|
|
||||||
vert = con_rect.make_vert()
|
|
||||||
frag = con_rect.make_frag()
|
|
||||||
|
|
||||||
vert.vstruct_as_vsin = False # Rect structure is used instead
|
|
||||||
|
|
||||||
vert.add_in('vec2 pos')
|
|
||||||
vert.add_out('vec2 texCoordRect')
|
|
||||||
vert.add_out('vec3 viewRay')
|
|
||||||
vert.add_uniform('float materialID', link='_objectInfoMaterialIndex')
|
|
||||||
vert.add_uniform('mat4 invVP', link='_inverseViewProjectionMatrix')
|
|
||||||
vert.add_uniform('vec3 eye', link='_cameraPosition')
|
|
||||||
vert.write('const vec2 madd = vec2(0.5, 0.5);')
|
|
||||||
vert.write('texCoordRect = pos.xy * madd + madd;')
|
|
||||||
vert.write('const float fstep = 1.0 / 16777216.0; // 24bit')
|
|
||||||
# vert.write('const float fstep = 1.0 / 65536.0; // 16bit')
|
|
||||||
vert.write('gl_Position = vec4(pos.xy, (materialID * fstep) * 2.0 - 1.0, 1.0);')
|
|
||||||
vert.write('vec4 v = vec4(pos.xy, 1.0, 1.0);')
|
|
||||||
vert.write('v = vec4(invVP * v);')
|
|
||||||
vert.write('v.xyz /= v.w;')
|
|
||||||
vert.write('viewRay = v.xyz - eye;')
|
|
||||||
|
|
||||||
frag.ins = vert.outs
|
|
||||||
frag.add_out('vec4 fragColor')
|
|
||||||
frag.add_include('compiled.inc')
|
|
||||||
frag.add_include('std/brdf.glsl')
|
|
||||||
frag.add_include('std/math.glsl')
|
|
||||||
frag.add_include('std/gbuffer.glsl')
|
|
||||||
frag.add_include('std/shirr.glsl')
|
|
||||||
frag.add_include('std/shadows.glsl')
|
|
||||||
|
|
||||||
frag.add_uniform('sampler2D gbuffer0')
|
|
||||||
frag.add_uniform('sampler2D gbuffer1')
|
|
||||||
frag.add_uniform('sampler2D gbuffer2')
|
|
||||||
frag.add_uniform('sampler2D gbufferD')
|
|
||||||
frag.add_uniform('sampler2D ssaotex')
|
|
||||||
frag.add_uniform('sampler2D shadowMap')
|
|
||||||
frag.add_uniform('sampler2D shadowMapCube')
|
|
||||||
frag.add_uniform('mat4 LWVP', link='_biasLightWorldViewProjectionMatrix')
|
|
||||||
frag.add_uniform('vec3 eye', link='_cameraPosition')
|
|
||||||
frag.add_uniform('vec3 eyeLook', link='_cameraLook')
|
|
||||||
frag.add_uniform('vec3 lightPos', link='_lightPosition')
|
|
||||||
frag.add_uniform('vec3 lightColor', link='_lightColor')
|
|
||||||
frag.add_uniform('int lightShadow', link='_lightCastShadow')
|
|
||||||
frag.add_uniform('vec2 lightProj', link='_lightPlaneProj')
|
|
||||||
frag.add_uniform('float shadowsBias', link='_lightShadowsBias')
|
|
||||||
# TODO: ifdef
|
|
||||||
frag.add_uniform('float envmapStrength', link='_envmapStrength')
|
|
||||||
frag.add_uniform('vec4 shirr[7]', link='_envmapIrradiance', included=True)
|
|
||||||
frag.add_uniform('sampler2D senvmapRadiance', link='_envmapRadiance')
|
|
||||||
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);')
|
|
||||||
frag.write('float depth = texture(gbufferD, texCoordRect).r * 2.0 - 1.0;')
|
|
||||||
|
|
||||||
frag.write('vec3 n;')
|
|
||||||
frag.write('n.z = 1.0 - abs(g0.x) - abs(g0.y);')
|
|
||||||
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.add_uniform('vec2 cameraProj', link='_cameraPlaneProj')
|
|
||||||
frag.write('vec3 wposition = getPos(eye, eyeLook, viewRay, depth, cameraProj);')
|
|
||||||
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(vVec + l);')
|
|
||||||
frag.write('float dotNH = dot(n, h);')
|
|
||||||
frag.write('float dotVH = dot(vVec, h);')
|
|
||||||
frag.write('float visibility = 1.0;')
|
|
||||||
|
|
||||||
frag.write('vec3 basecol;')
|
|
||||||
frag.write('float roughness;')
|
|
||||||
frag.write('float metallic;')
|
|
||||||
frag.write('float occlusion;')
|
|
||||||
frag.write('float specular;')
|
|
||||||
|
|
||||||
mat_state.texture_grad = True
|
|
||||||
cycles.parse(mat_state.nodes, con_rect, vert, frag, None, None, None, parse_opacity=False, parse_displacement=False)
|
|
||||||
mat_state.texture_grad = False
|
|
||||||
|
|
||||||
frag.write('vec3 albedo = surfaceAlbedo(basecol, metallic);')
|
|
||||||
frag.write('vec3 f0 = surfaceF0(basecol, metallic);')
|
|
||||||
|
|
||||||
# Shadows
|
|
||||||
frag.write('if (lightShadow == 1) {')
|
|
||||||
frag.write(' vec4 lPos = LWVP * vec4(wposition, 1.0);')
|
|
||||||
frag.write(' lPos.xyz /= lPos.w;')
|
|
||||||
frag.write(' if (lPos.x > 0.0 && lPos.y > 0.0 && lPos.x < 1.0 && lPos.y < 1.0) visibility = PCF(lPos.xy, lPos.z - shadowsBias);;')
|
|
||||||
frag.write('}')
|
|
||||||
frag.write('else if (lightShadow == 2) {')
|
|
||||||
frag.write(' visibility = PCFCube(shadowMapCube, lp, -l, shadowsBias, lightProj, n);')
|
|
||||||
frag.write('}')
|
|
||||||
|
|
||||||
frag.write('visibility *= attenuate(distance(wposition, lightPos));')
|
|
||||||
|
|
||||||
frag.write('fragColor.rgb = lambertDiffuseBRDF(albedo, dotNL) + specularBRDF(f0, roughness, dotNL, dotNH, dotNV, dotVH) * specular;')
|
|
||||||
frag.write('fragColor.rgb *= lightColor;')
|
|
||||||
frag.write('fragColor.rgb *= visibility;')
|
|
||||||
|
|
||||||
# Env
|
|
||||||
frag.write('vec2 envBRDF = texture(senvmapBrdf, vec2(roughness, 1.0 - dotNV)).xy;')
|
|
||||||
frag.write('vec3 envl = shIrradiance(n) / PI;')
|
|
||||||
|
|
||||||
frag.write('vec3 reflectionWorld = reflect(-vVec, n);')
|
|
||||||
frag.write('float lod = getMipFromRoughness(roughness, envmapNumMipmaps);')
|
|
||||||
frag.write('vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(reflectionWorld), lod).rgb;')
|
|
||||||
|
|
||||||
frag.write('envl.rgb *= albedo;')
|
|
||||||
frag.write('envl.rgb += prefilteredColor * (f0 * envBRDF.x + envBRDF.y);')
|
|
||||||
frag.write('envl.rgb *= texture(ssaotex, texCoordRect).r;')
|
|
||||||
frag.write('envl.rgb *= envmapStrength * occlusion;')
|
|
||||||
|
|
||||||
frag.write('fragColor.rgb += envl;')
|
|
|
@ -7,7 +7,6 @@ import arm.material.mat_state as mat_state
|
||||||
from arm.material.shader import ShaderData
|
from arm.material.shader import ShaderData
|
||||||
import arm.material.cycles as cycles
|
import arm.material.cycles as cycles
|
||||||
import arm.material.make_mesh as make_mesh
|
import arm.material.make_mesh as make_mesh
|
||||||
import arm.material.make_rect as make_rect
|
|
||||||
import arm.material.make_transluc as make_transluc
|
import arm.material.make_transluc as make_transluc
|
||||||
import arm.material.make_overlay as make_overlay
|
import arm.material.make_overlay as make_overlay
|
||||||
import arm.material.make_depth as make_depth
|
import arm.material.make_depth as make_depth
|
||||||
|
@ -77,9 +76,6 @@ def build(material, mat_users, mat_armusers):
|
||||||
elif rp == 'mesh':
|
elif rp == 'mesh':
|
||||||
con = make_mesh.make(rp)
|
con = make_mesh.make(rp)
|
||||||
|
|
||||||
elif rp == 'rect':
|
|
||||||
con = make_rect.make(rp)
|
|
||||||
|
|
||||||
elif rp == 'shadowmap':
|
elif rp == 'shadowmap':
|
||||||
con = make_depth.make(rp, rpasses, shadowmap=True)
|
con = make_depth.make(rp, rpasses, shadowmap=True)
|
||||||
|
|
||||||
|
|
|
@ -41,8 +41,6 @@ def get_rpasses(material):
|
||||||
ar.append(con)
|
ar.append(con)
|
||||||
if (rpdat.rp_gi == 'Voxel GI' or rpdat.rp_gi == 'Voxel AO') and has_voxels:
|
if (rpdat.rp_gi == 'Voxel GI' or rpdat.rp_gi == 'Voxel AO') and has_voxels:
|
||||||
ar.append('voxel')
|
ar.append('voxel')
|
||||||
if rpdat.rp_renderer == 'Deferred Plus':
|
|
||||||
ar.append('rect')
|
|
||||||
if rpdat.rp_renderer == 'Forward' and rpdat.rp_depthprepass and not material.arm_blending and not material.arm_particle_flag:
|
if rpdat.rp_renderer == 'Forward' and rpdat.rp_depthprepass and not material.arm_blending and not material.arm_particle_flag:
|
||||||
ar.append('depth')
|
ar.append('depth')
|
||||||
|
|
||||||
|
|
|
@ -258,8 +258,7 @@ class ArmRPListItem(bpy.types.PropertyGroup):
|
||||||
rp_renderer = EnumProperty(
|
rp_renderer = EnumProperty(
|
||||||
items=[('Forward', 'Forward', 'Forward'),
|
items=[('Forward', 'Forward', 'Forward'),
|
||||||
('Deferred', 'Deferred', 'Deferred'),
|
('Deferred', 'Deferred', 'Deferred'),
|
||||||
# ('Deferred Plus', 'Deferred Plus', 'Deferred Plus'),
|
# ('Raytracer', 'Raytracer', 'Raytracer'),
|
||||||
# ('Pathtracer', 'Pathtracer', 'Pathtracer'),
|
|
||||||
],
|
],
|
||||||
name="Renderer", description="Renderer type", default='Deferred', update=update_renderpath)
|
name="Renderer", description="Renderer type", default='Deferred', update=update_renderpath)
|
||||||
rp_depthprepass = BoolProperty(name="Depth Prepass", description="Depth Prepass for mesh context", default=True, update=update_renderpath)
|
rp_depthprepass = BoolProperty(name="Depth Prepass", description="Depth Prepass for mesh context", default=True, update=update_renderpath)
|
||||||
|
|
|
@ -732,7 +732,7 @@ class ArmRenderPathPanel(bpy.types.Panel):
|
||||||
self.label(layout, text='Renderer')
|
self.label(layout, text='Renderer')
|
||||||
box = self.box(layout)
|
box = self.box(layout)
|
||||||
row = self.row(box)
|
row = self.row(box)
|
||||||
self.prop(row, rpdat, 'rp_renderer', expand=True)
|
self.prop(row, rpdat, 'rp_renderer')
|
||||||
col = self.column(box, enabled=(rpdat.rp_renderer == 'Forward'))
|
col = self.column(box, enabled=(rpdat.rp_renderer == 'Forward'))
|
||||||
self.prop(col, rpdat, 'rp_depthprepass')
|
self.prop(col, rpdat, 'rp_depthprepass')
|
||||||
self.prop(col, rpdat, 'arm_material_model')
|
self.prop(col, rpdat, 'arm_material_model')
|
||||||
|
|
Loading…
Reference in a new issue