Begin renderer work

This commit is contained in:
luboslenco 2018-11-19 13:18:40 +01:00
parent 6f6ff24f12
commit 10442cf0ff
11 changed files with 13 additions and 212 deletions

View file

@ -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;
}

View file

@ -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;

View file

@ -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);

View file

@ -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'

View file

@ -895,15 +895,11 @@ 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('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)))

View file

@ -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()

View file

@ -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;')

View file

@ -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)

View file

@ -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')

View file

@ -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)

View file

@ -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')