Begin renderer work
This commit is contained in:
parent
6f6ff24f12
commit
10442cf0ff
|
@ -27,9 +27,9 @@ class RenderPathCreator {
|
|||
#elseif (rp_renderer == "Deferred")
|
||||
RenderPathDeferred.init(path);
|
||||
path.commands = RenderPathDeferred.commands;
|
||||
#elseif (rp_renderer == "Pathtracer")
|
||||
RenderPathPathtracer.init(path);
|
||||
path.commands = RenderPathPathtracer.commands;
|
||||
#elseif (rp_renderer == "Raytracer")
|
||||
RenderPathRaytracer.init(path);
|
||||
path.commands = RenderPathRaytracer.commands;
|
||||
#end
|
||||
return path;
|
||||
}
|
||||
|
|
|
@ -16,9 +16,9 @@ import kha.graphics5.TextureFormat;
|
|||
|
||||
import iron.RenderPath;
|
||||
|
||||
class RenderPathPathtracer {
|
||||
class RenderPathRaytracer {
|
||||
|
||||
#if (rp_renderer == "Pathtracer")
|
||||
#if (rp_renderer == "Raytracer")
|
||||
|
||||
static var path:RenderPath;
|
||||
static var ready = false;
|
|
@ -1111,17 +1111,9 @@ class Cycles {
|
|||
frag.write_normal++;
|
||||
parse_teximage_vector = false; // Force texCoord for normal map image vector
|
||||
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) {
|
||||
|
||||
frag.write('vec3 texn = ($out_normaltan) * 2.0 - 1.0;');
|
||||
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) {
|
||||
cotangentFrameWritten = true;
|
||||
frag.add_function(CyclesFunctions.str_cotangentFrame);
|
||||
|
|
|
@ -240,7 +240,7 @@ def compile(assets_only=False):
|
|||
cmd.append('--vr')
|
||||
cmd.append('webvr')
|
||||
|
||||
if arm.utils.get_rp().rp_renderer == 'Pathtracer':
|
||||
if arm.utils.get_rp().rp_renderer == 'Raytracer':
|
||||
cmd.append('--raytrace')
|
||||
cmd.append('dxr')
|
||||
dxc_path = fp + '/HlslShaders/fxc.exe'
|
||||
|
|
|
@ -895,14 +895,10 @@ def parse_normal_map_color_input(inp, strength_input=None):
|
|||
return
|
||||
normal_parsed = True
|
||||
frag.write_normal += 1
|
||||
defplus = get_rp_renderer() == 'Deferred Plus'
|
||||
if not get_arm_export_tangents() or defplus or mat_get_material().arm_decal: # Compute TBN matrix
|
||||
if not get_arm_export_tangents() 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('texn.y = -texn.y;')
|
||||
frag.add_include('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:
|
||||
|
|
|
@ -53,10 +53,8 @@ def make(context_id):
|
|||
make_forward(con_mesh)
|
||||
elif rid == 'Deferred':
|
||||
make_deferred(con_mesh)
|
||||
# elif rid == 'Deferred Plus':
|
||||
# make_deferred_plus(con_mesh)
|
||||
elif rid == 'Pathtracer':
|
||||
make_pathtracer(con_mesh)
|
||||
elif rid == 'Raytracer':
|
||||
make_raytracer(con_mesh)
|
||||
|
||||
make_finalize(con_mesh)
|
||||
|
||||
|
@ -406,45 +404,7 @@ def make_deferred(con_mesh):
|
|||
|
||||
return con_mesh
|
||||
|
||||
# def make_deferred_plus(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):
|
||||
def make_raytracer(con_mesh):
|
||||
wrd = bpy.data.worlds['Arm']
|
||||
vert = con_mesh.make_vert()
|
||||
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
|
||||
import arm.material.cycles as cycles
|
||||
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_overlay as make_overlay
|
||||
import arm.material.make_depth as make_depth
|
||||
|
@ -77,9 +76,6 @@ def build(material, mat_users, mat_armusers):
|
|||
elif rp == 'mesh':
|
||||
con = make_mesh.make(rp)
|
||||
|
||||
elif rp == 'rect':
|
||||
con = make_rect.make(rp)
|
||||
|
||||
elif rp == 'shadowmap':
|
||||
con = make_depth.make(rp, rpasses, shadowmap=True)
|
||||
|
||||
|
|
|
@ -41,8 +41,6 @@ def get_rpasses(material):
|
|||
ar.append(con)
|
||||
if (rpdat.rp_gi == 'Voxel GI' or rpdat.rp_gi == 'Voxel AO') and has_voxels:
|
||||
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:
|
||||
ar.append('depth')
|
||||
|
||||
|
|
|
@ -258,8 +258,7 @@ class ArmRPListItem(bpy.types.PropertyGroup):
|
|||
rp_renderer = EnumProperty(
|
||||
items=[('Forward', 'Forward', 'Forward'),
|
||||
('Deferred', 'Deferred', 'Deferred'),
|
||||
# ('Deferred Plus', 'Deferred Plus', 'Deferred Plus'),
|
||||
# ('Pathtracer', 'Pathtracer', 'Pathtracer'),
|
||||
# ('Raytracer', 'Raytracer', 'Raytracer'),
|
||||
],
|
||||
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)
|
||||
|
|
|
@ -732,7 +732,7 @@ class ArmRenderPathPanel(bpy.types.Panel):
|
|||
self.label(layout, text='Renderer')
|
||||
box = self.box(layout)
|
||||
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'))
|
||||
self.prop(col, rpdat, 'rp_depthprepass')
|
||||
self.prop(col, rpdat, 'arm_material_model')
|
||||
|
|
Loading…
Reference in a new issue