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];
shaderWorker.addTask(fwd -> {
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.addShader(shad);
var thisprops:Dynamic = material.getDefaultProps();
@ -965,6 +975,7 @@ class DifBuilder {
material.props = thisprops;
material.shadows = false;
material.receiveShadows = true;
material.mainPass.setPassName("interior");
fwd();
});
});

View file

@ -241,6 +241,34 @@ class InstanceManager {
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);
// if (dtsshader != null) {
// 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) {
super.update(dt);
if (loaded) {
ProfilerUI.begin();
ProfilerUI.measure("updateBegin");
if (loaded) {
// try {
// timeAccumulator += dt;
// while (timeAccumulator > 1 / 60) {
@ -154,9 +153,9 @@ class Main extends hxd.App {
if (loaded) {
ProfilerUI.measure("renderBegin");
marbleGame.render(e);
ProfilerUI.end();
}
super.render(e);
ProfilerUI.end();
}
static function main() {

View file

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

View file

@ -200,6 +200,8 @@ class MarbleWorld extends Scheduler {
var oobSchedule:Float;
var oobSchedule2:Float;
var _cubemapNeedsUpdate:Bool = false;
var lock: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) {
marble.update(timeState, collisionWorld, this.pathedInteriors);
}
_cubemapNeedsUpdate = true;
if (this.rewinding) {
// Update camera separately
marble.camera.update(timeState.currentAttemptTime, realDt);
@ -1086,8 +1089,12 @@ class MarbleWorld extends Scheduler {
if (this.playGui != null && _ready)
this.playGui.render(e);
if (this.marble != null && this.marble.cubemapRenderer != null) {
ProfilerUI.measure("renderCubemap");
if (_cubemapNeedsUpdate) {
this.marble.cubemapRenderer.position.load(this.marble.getAbsPos().getPosition());
this.marble.cubemapRenderer.render(e, 0.002);
this.marble.cubemapRenderer.render(e);
_cubemapNeedsUpdate = false;
}
}
}

View file

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

View file

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

View file

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

View file

@ -153,6 +153,21 @@ class VideoOptionsGui extends GuiImage {
}
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();
bottomBar.position = new Vector(0, 590);
bottomBar.extent = new Vector(640, 200);

View file

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