reflection quality

This commit is contained in:
RandomityGuy 2023-07-01 23:28:30 +05:30
parent 4846643a3e
commit 3ab79b461b
10 changed files with 120 additions and 34 deletions

View file

@ -958,6 +958,16 @@ class DifBuilder {
var retrievefunc = shaderMaterialDict[exactName]; var retrievefunc = shaderMaterialDict[exactName];
shaderWorker.addTask(fwd -> { shaderWorker.addTask(fwd -> {
retrievefunc(shad -> { retrievefunc(shad -> {
var zPass = material.mainPass.clone();
zPass.removeShader(material.textureShader);
var tx = zPass.getShader(h3d.shader.Texture);
zPass.removeShader(tx);
zPass.setColorMask(false, false, false, false);
zPass.depthWrite = true;
zPass.setPassName("zPass");
material.addPass(zPass);
material.mainPass.depthTest = LessEqual;
material.mainPass.removeShader(material.textureShader); material.mainPass.removeShader(material.textureShader);
material.mainPass.addShader(shad); material.mainPass.addShader(shad);
var thisprops:Dynamic = material.getDefaultProps(); var thisprops:Dynamic = material.getDefaultProps();
@ -965,6 +975,7 @@ class DifBuilder {
material.props = thisprops; material.props = thisprops;
material.shadows = false; material.shadows = false;
material.receiveShadows = true; material.receiveShadows = true;
material.mainPass.setPassName("interior");
fwd(); fwd();
}); });
}); });

View file

@ -241,6 +241,34 @@ class InstanceManager {
minfo.meshbatch.material.addPass(gpass); minfo.meshbatch.material.addPass(gpass);
} }
var zPass = mat.getPass("zPass");
if (zPass != null) {
var gpass = zPass.clone();
gpass.enableLights = false;
gpass.depthTest = zPass.depthTest;
gpass.blendSrc = zPass.blendSrc;
gpass.blendDst = zPass.blendDst;
gpass.blendOp = zPass.blendOp;
gpass.blendAlphaSrc = zPass.blendAlphaSrc;
gpass.blendAlphaDst = zPass.blendAlphaDst;
gpass.blendAlphaOp = zPass.blendAlphaOp;
gpass.colorMask = zPass.colorMask;
minfoshaders = [];
for (shader in gpass.getShaders()) {
minfoshaders.push(shader);
}
for (shader in minfoshaders)
gpass.removeShader(shader);
var addshaders = [];
for (shader in zPass.getShaders()) {
addshaders.push(shader);
}
for (shader in addshaders)
gpass.addShader(shader);
minfo.meshbatch.material.addPass(gpass);
}
// var dtsshader = mat.mainPass.getShader(DtsTexture); // var dtsshader = mat.mainPass.getShader(DtsTexture);
// if (dtsshader != null) { // if (dtsshader != null) {
// minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader); // minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader);

View file

@ -128,10 +128,9 @@ class Main extends hxd.App {
override function update(dt:Float) { override function update(dt:Float) {
super.update(dt); super.update(dt);
ProfilerUI.begin();
ProfilerUI.measure("updateBegin");
if (loaded) { if (loaded) {
ProfilerUI.begin();
ProfilerUI.measure("updateBegin");
// try { // try {
// timeAccumulator += dt; // timeAccumulator += dt;
// while (timeAccumulator > 1 / 60) { // while (timeAccumulator > 1 / 60) {
@ -154,9 +153,9 @@ class Main extends hxd.App {
if (loaded) { if (loaded) {
ProfilerUI.measure("renderBegin"); ProfilerUI.measure("renderBegin");
marbleGame.render(e); marbleGame.render(e);
ProfilerUI.end();
} }
super.render(e); super.render(e);
ProfilerUI.end();
} }
static function main() { static function main() {

View file

@ -336,7 +336,7 @@ class Marble extends GameObject {
mat.receiveShadows = false; mat.receiveShadows = false;
// mat.mainPass.culling = None; // mat.mainPass.culling = None;
if (Settings.optionsSettings.reflectiveMarble) { if (Settings.optionsSettings.reflectionDetail > 0) {
var csky = level != null ? level.sky : (@:privateAccess MarbleGame.instance.previewWorld.sky); var csky = level != null ? level.sky : (@:privateAccess MarbleGame.instance.previewWorld.sky);
this.cubemapRenderer = new CubemapRenderer(MarbleGame.instance.scene, csky); this.cubemapRenderer = new CubemapRenderer(MarbleGame.instance.scene, csky);

View file

@ -200,6 +200,8 @@ class MarbleWorld extends Scheduler {
var oobSchedule:Float; var oobSchedule:Float;
var oobSchedule2:Float; var oobSchedule2:Float;
var _cubemapNeedsUpdate:Bool = false;
var lock:Bool = false; var lock:Bool = false;
public function new(scene:Scene, scene2d:h2d.Scene, mission:Mission, record:Bool = false) { public function new(scene:Scene, scene2d:h2d.Scene, mission:Mission, record:Bool = false) {
@ -1044,6 +1046,7 @@ class MarbleWorld extends Scheduler {
for (marble in marbles) { for (marble in marbles) {
marble.update(timeState, collisionWorld, this.pathedInteriors); marble.update(timeState, collisionWorld, this.pathedInteriors);
} }
_cubemapNeedsUpdate = true;
if (this.rewinding) { if (this.rewinding) {
// Update camera separately // Update camera separately
marble.camera.update(timeState.currentAttemptTime, realDt); marble.camera.update(timeState.currentAttemptTime, realDt);
@ -1086,8 +1089,12 @@ class MarbleWorld extends Scheduler {
if (this.playGui != null && _ready) if (this.playGui != null && _ready)
this.playGui.render(e); this.playGui.render(e);
if (this.marble != null && this.marble.cubemapRenderer != null) { if (this.marble != null && this.marble.cubemapRenderer != null) {
this.marble.cubemapRenderer.position.load(this.marble.getAbsPos().getPosition()); ProfilerUI.measure("renderCubemap");
this.marble.cubemapRenderer.render(e, 0.002); if (_cubemapNeedsUpdate) {
this.marble.cubemapRenderer.position.load(this.marble.getAbsPos().getPosition());
this.marble.cubemapRenderer.render(e);
_cubemapNeedsUpdate = false;
}
} }
} }

View file

@ -73,6 +73,7 @@ class PreviewWorld extends Scheduler {
var itrAddTime:Float = 0; var itrAddTime:Float = 0;
var _loadToken = 0; var _loadToken = 0;
var _cubemapNeedsUpdate:Bool = false;
public function new(scene:Scene) { public function new(scene:Scene) {
this.scene = scene; this.scene = scene;
@ -595,14 +596,18 @@ class PreviewWorld extends Scheduler {
for (marb in marbles) { for (marb in marbles) {
marb.update(timeState, this.collisionWorld, []); marb.update(timeState, this.collisionWorld, []);
} }
_cubemapNeedsUpdate = true;
this.instanceManager.render(); this.instanceManager.render();
} }
public function render(e:h3d.Engine) { public function render(e:h3d.Engine) {
for (marble in marbles) { for (marble in marbles) {
if (marble != null && marble.cubemapRenderer != null) { if (marble != null && marble.cubemapRenderer != null) {
marble.cubemapRenderer.position.load(marble.getAbsPos().getPosition()); if (_cubemapNeedsUpdate) {
marble.cubemapRenderer.render(e, 0.002); marble.cubemapRenderer.position.load(marble.getAbsPos().getPosition());
marble.cubemapRenderer.render(e);
_cubemapNeedsUpdate = false;
}
} }
} }
} }

View file

@ -8,6 +8,8 @@ import h3d.Vector;
import shaders.Blur; import shaders.Blur;
import h3d.pass.ScreenFx; import h3d.pass.ScreenFx;
import h3d.mat.DepthBuffer; import h3d.mat.DepthBuffer;
import src.ProfilerUI;
import src.Settings;
class Renderer extends h3d.scene.Renderer { class Renderer extends h3d.scene.Renderer {
var def(get, never):h3d.pass.Base; var def(get, never):h3d.pass.Base;
@ -62,12 +64,8 @@ class Renderer extends h3d.scene.Renderer {
} }
override function getPassByName(name:String):h3d.pass.Base { override function getPassByName(name:String):h3d.pass.Base {
if (name == "alpha" if (name == "alpha" || name == "additive" || name == "glowPre" || name == "glow" || name == "refract" || name == "glowPreNoRender"
|| name == "additive" || name == "interior" || name == "zPass")
|| name == "glowPre"
|| name == "glow"
|| name == "refract"
|| name == "glowPreNoRender")
return defaultPass; return defaultPass;
return super.getPassByName(name); return super.getPassByName(name);
} }
@ -99,13 +97,32 @@ class Renderer extends h3d.scene.Renderer {
// ctx.engine.pushTarget(backBuffers[0]); // ctx.engine.pushTarget(backBuffers[0]);
// ctx.engine.clear(0, 1); // ctx.engine.clear(0, 1);
renderPass(defaultPass, get("sky")); if (!cubemapPass)
renderPass(defaultPass, get("skyshape"), backToFront); ProfilerUI.measure("sky");
renderPass(defaultPass, get("default")); if (!cubemapPass || Settings.optionsSettings.reflectionDetail >= 1) {
renderPass(defaultPass, get("glowPre")); renderPass(defaultPass, get("sky"));
renderPass(defaultPass, get("skyshape"), backToFront);
}
if (!cubemapPass || Settings.optionsSettings.reflectionDetail >= 2) {
if (!cubemapPass)
ProfilerUI.measure("interiorZPass");
renderPass(defaultPass, get("zPass"));
if (!cubemapPass)
ProfilerUI.measure("interior");
renderPass(defaultPass, get("interior"));
}
if (!cubemapPass)
ProfilerUI.measure("render");
if (!cubemapPass || Settings.optionsSettings.reflectionDetail >= 3) {
renderPass(defaultPass, get("default"));
}
if (!cubemapPass)
ProfilerUI.measure("glow");
if (!cubemapPass || Settings.optionsSettings.reflectionDetail >= 4)
renderPass(defaultPass, get("glowPre"));
// Glow pass // Glow pass
if (!cubemapPass) { if (!cubemapPass || Settings.optionsSettings.reflectionDetail >= 4) {
var glowObjects = get("glow"); var glowObjects = get("glow");
if (!glowObjects.isEmpty()) { if (!glowObjects.isEmpty()) {
ctx.engine.pushTarget(glowBuffer); ctx.engine.pushTarget(glowBuffer);
@ -119,17 +136,23 @@ class Renderer extends h3d.scene.Renderer {
copyPass.render(); copyPass.render();
} }
} }
if (!cubemapPass)
ProfilerUI.measure("refract");
// Refraction pass // Refraction pass
if (!cubemapPass) { if (!cubemapPass || Settings.optionsSettings.reflectionDetail >= 4) {
var refractObjects = get("refract"); var refractObjects = get("refract");
if (!refractObjects.isEmpty()) { if (!refractObjects.isEmpty()) {
h3d.pass.Copy.run(backBuffer, sfxBuffer); h3d.pass.Copy.run(backBuffer, sfxBuffer);
renderPass(defaultPass, refractObjects); renderPass(defaultPass, refractObjects);
} }
} }
if (!cubemapPass)
ProfilerUI.measure("alpha");
renderPass(defaultPass, get("alpha"), backToFront); if (!cubemapPass || Settings.optionsSettings.reflectionDetail >= 4) {
renderPass(defaultPass, get("additive")); renderPass(defaultPass, get("alpha"), backToFront);
renderPass(defaultPass, get("additive"));
}
ctx.engine.popTarget(); ctx.engine.popTarget();

View file

@ -36,7 +36,6 @@ typedef OptionsSettings = {
var fovX:Int; var fovX:Int;
var frameRateVis:Bool; var frameRateVis:Bool;
var oobInsults:Bool; var oobInsults:Bool;
var reflectiveMarble:Bool;
var marbleIndex:Int; var marbleIndex:Int;
var marbleCategoryIndex:Int; var marbleCategoryIndex:Int;
var marbleSkin:String; var marbleSkin:String;
@ -44,6 +43,7 @@ typedef OptionsSettings = {
var marbleShader:String; var marbleShader:String;
var rewindEnabled:Bool; var rewindEnabled:Bool;
var rewindTimescale:Float; var rewindTimescale:Float;
var reflectionDetail:Int;
} }
typedef ControlsSettings = { typedef ControlsSettings = {
@ -119,7 +119,6 @@ class Settings {
fovX: 90, fovX: 90,
frameRateVis: true, frameRateVis: true,
oobInsults: true, oobInsults: true,
reflectiveMarble: true,
marbleIndex: 0, marbleIndex: 0,
marbleCategoryIndex: 0, marbleCategoryIndex: 0,
marbleSkin: "base", marbleSkin: "base",
@ -127,6 +126,7 @@ class Settings {
marbleShader: "Default", marbleShader: "Default",
rewindEnabled: false, rewindEnabled: false,
rewindTimescale: 1, rewindTimescale: 1,
reflectionDetail: 3,
vsync: #if js true #end vsync: #if js true #end
#if hl #if hl
false false
@ -352,6 +352,10 @@ class Settings {
optionsSettings.rewindEnabled = false; optionsSettings.rewindEnabled = false;
if (optionsSettings.rewindTimescale == 0 #if js || optionsSettings.rewindTimescale == null #end) if (optionsSettings.rewindTimescale == 0 #if js || optionsSettings.rewindTimescale == null #end)
optionsSettings.rewindTimescale = 1; optionsSettings.rewindTimescale = 1;
#if js
if (optionsSettings.reflectionDetail == null)
optionsSettings.reflectionDetail = 2;
#end
controlsSettings = json.controls; controlsSettings = json.controls;
if (json.touch != null) { if (json.touch != null) {
touchSettings = json.touch; touchSettings = json.touch;

View file

@ -153,6 +153,21 @@ class VideoOptionsGui extends GuiImage {
} }
innerCtrl.addChild(fovOpt); innerCtrl.addChild(fovOpt);
yPos += 60;
var rfOpt = new GuiXboxOptionsList(1, "Reflection Detail", ["None", "Sky Only", "Level and Sky", "Level, Sky and Items", "Everything"], 0.35);
rfOpt.vertSizing = Bottom;
rfOpt.horizSizing = Right;
rfOpt.position = new Vector(380, yPos);
rfOpt.extent = new Vector(815, 94);
rfOpt.setCurrentOption(Settings.optionsSettings.reflectionDetail);
rfOpt.onChangeFunc = (idx) -> {
Settings.optionsSettings.reflectionDetail = idx;
return true;
}
innerCtrl.addChild(rfOpt);
var bottomBar = new GuiControl(); var bottomBar = new GuiControl();
bottomBar.position = new Vector(0, 590); bottomBar.position = new Vector(0, 590);
bottomBar.extent = new Vector(640, 200); bottomBar.extent = new Vector(640, 200);

View file

@ -17,6 +17,7 @@ class CubemapRenderer {
var camera:Camera; var camera:Camera;
var scene:Scene; var scene:Scene;
var nextFaceToRender:Int; var nextFaceToRender:Int;
var facesPerRender:Int = 2;
public function new(scene:Scene, sky:Sky) { public function new(scene:Scene, sky:Sky) {
this.scene = scene; this.scene = scene;
@ -28,14 +29,13 @@ class CubemapRenderer {
this.nextFaceToRender = 0; this.nextFaceToRender = 0;
} }
public function render(e:Engine, budget:Float = 1e8) { public function render(e:Engine) {
var scenecam = scene.camera; var scenecam = scene.camera;
scene.camera = camera; scene.camera = camera;
var start = haxe.Timer.stamp();
var renderedFaces = 0; var renderedFaces = 0;
Renderer.cubemapPass = true; Renderer.cubemapPass = true;
for (i in 0...6) { for (i in 0...facesPerRender) {
var index = (nextFaceToRender + i) % 6; var index = (nextFaceToRender + i) % 6;
e.pushTarget(cubemap, index); e.pushTarget(cubemap, index);
@ -45,12 +45,6 @@ class CubemapRenderer {
e.popTarget(); e.popTarget();
renderedFaces++; renderedFaces++;
var time = haxe.Timer.stamp();
var elapsed = time - start;
var elapsedPerFace = elapsed / renderedFaces;
if (elapsedPerFace * (renderedFaces + 1) >= budget)
break;
} }
Renderer.cubemapPass = false; Renderer.cubemapPass = false;
scene.camera = scenecam; scene.camera = scenecam;