cubemap optimizations holy shit

This commit is contained in:
RandomityGuy 2024-03-03 00:55:28 +05:30
parent 8883602b60
commit 1b7a3f485f
5 changed files with 34 additions and 33 deletions

View file

@ -29,8 +29,6 @@ class Renderer extends h3d.scene.Renderer {
var growBufferTemps:Array<h3d.mat.Texture>;
var copyPass:h3d.pass.Copy;
var backBuffer:h3d.mat.Texture;
var tempCubemapBuffer:h3d.mat.Texture;
var tempCubemapIndex:Int;
public static var dirtyBuffers:Bool = true;
@ -54,11 +52,6 @@ class Renderer extends h3d.scene.Renderer {
return sfxBuffer;
}
public function setCubemapBuffer(tex:h3d.mat.Texture, idx:Int) {
tempCubemapBuffer = tex;
tempCubemapIndex = idx;
}
inline function get_def()
return defaultPass;
@ -103,9 +96,7 @@ class Renderer extends h3d.scene.Renderer {
backBuffer = ctx.textures.allocTarget("backBuffer", cast ctx.engine.width / pixelRatio, cast ctx.engine.height / pixelRatio, false);
backBuffer.depthBuffer = depthBuffer;
}
if (tempCubemapBuffer != null) {
ctx.engine.pushTarget(tempCubemapBuffer, tempCubemapIndex);
} else {
if (!cubemapPass) { // we push the target separately
ctx.engine.pushTarget(backBuffer);
}
ctx.engine.clear(0, 1);
@ -207,11 +198,10 @@ class Renderer extends h3d.scene.Renderer {
if (!cubemapPass && dirtyBuffers)
dirtyBuffers = false;
ctx.engine.popTarget();
if (!cubemapPass)
ctx.engine.popTarget();
if (tempCubemapBuffer != null) {
tempCubemapBuffer = null;
} else {
if (!cubemapPass) {
copyPass.pass.blend(One, Zero);
copyPass.shader.texture = backBuffer;
copyPass.render();

View file

@ -46,13 +46,14 @@ class CubemapRenderer {
if (Settings.optionsSettings.reflectionDetail >= 4)
Renderer.dirtyBuffers = true;
// e.pushTarget(cubemap, index);
e.pushTarget(cubemap, index);
var ourRenderer = cast(scene.renderer, Renderer);
ourRenderer.setCubemapBuffer(cubemap, index);
// ourRenderer.setCubemapBuffer(cubemap, index);
this.camera.setCubeMap(index, position);
// e.clear(0, 1);
this.camera.update();
e.clear(0, 1);
scene.render(e);
// e.popTarget();
e.popTarget();
renderedFaces++;
var time = haxe.Timer.stamp();

View file

@ -32,7 +32,7 @@ class DefaultCubemapMaterial extends hxsl.Shader {
var pixelTransformedPosition:Vec3;
var transformedNormal:Vec3;
@const var doGammaRamp:Bool;
// @var var outReflectVec:Vec3;
@var var outReflectVec:Vec3;
@var var outLightVec:Vec4;
@var var outPos:Vec3;
@var var outEyePos:Vec3;
@ -62,10 +62,12 @@ class DefaultCubemapMaterial extends hxsl.Shader {
var inLightVec = vec3(-0.5732, 0.27536, -0.77176) * mat3(global.modelViewTranspose);
// inLightVec.x *= -1;
outLightVec.xyz = -inLightVec * objToTangentSpace;
// var cubeVertPos = input.position * cubeTrans;
// var cubeNormal = input.normal * cubeTrans;
// var eyeToVert = (cubeVertPos - cubeEyePos).normalize();
// outReflectVec = reflect(eyeToVert, cubeNormal);
var cubeVertPos = input.position * cubeTrans;
var cubeNormal = (input.normal * cubeTrans).normalize();
var eyeToVert = (cubeVertPos - cubeEyePos);
outReflectVec = reflect(eyeToVert, cubeNormal);
var p = input.position;
// p.x *= -1;
outPos = (p / 100.0) * objToTangentSpace;
@ -80,12 +82,12 @@ class DefaultCubemapMaterial extends hxsl.Shader {
var outCol = diffuse;
var bumpNormal = normalMap.get(calculatedUV * secondaryMapUvFactor).xyz * 2 - 1;
var incidentRay = normalize(pixelTransformedPosition - camera.position);
var reflectionRay = reflect(incidentRay, transformedNormal);
// var incidentRay = normalize(pixelTransformedPosition - camera.position);
// var reflectionRay = reflect(incidentRay, transformedNormal);
var bumpDot = ((dot(bumpNormal, outLightVec.xyz) + 1) * 0.5);
outCol *= (shading * bumpDot) + ambient;
outCol += diffuse.a * cubeMap.get(reflectionRay);
outCol += diffuse.a * cubeMap.get(outReflectVec);
var eyeVec = (outEyePos - outPos).normalize();
var halfAng = (eyeVec + outLightVec.xyz).normalize();

View file

@ -61,17 +61,25 @@ class DefaultCubemapNormalMaterial extends hxsl.Shader {
var cubeTrans = mat3(global.modelView);
var cubeEyePos = camera.position - global.modelView[3].xyz;
var cubeVertPos = input.position * cubeTrans;
var cubeNormal = (input.normal * cubeTrans).normalize();
var eyeToVert = (cubeVertPos - cubeEyePos);
outReflectVec = reflect(eyeToVert, cubeNormal);
// var cubeTrans = mat3(global.modelView);
// var cubeEyePos = camera.position - global.modelView[3].xyz;
// cubeEyePos.x *= -1;
outPos = input.position;
// outPos.x *= -1;
var cubeVertPos = input.position * cubeTrans;
// var cubeVertPos = input.position * cubeTrans;
// cubeVertPos.x *= -1;
var cubeNormal = (input.normal * cubeTrans).normalize();
// var cubeNormal = (input.normal * cubeTrans).normalize();
// cubeNormal.x *= -1;
var eyeToVert = cubeVertPos - cubeEyePos;
outReflectVec = reflect(eyeToVert, cubeNormal);
// var eyeToVert = cubeVertPos - cubeEyePos;
// outReflectVec = reflect(eyeToVert, cubeNormal);
}
function fragment() {
// Diffuse part

View file

@ -55,9 +55,9 @@ class DefaultCubemapNormalNoSpecMaterial extends hxsl.Shader {
var p = input.position;
// p.x *= -1;
var cubeVertPos = p * cubeTrans;
var cubeNormal = (pN * cubeTrans).normalize();
var eyeToVert = cubeVertPos - cubeEyePos;
var cubeVertPos = input.position * cubeTrans;
var cubeNormal = (input.normal * cubeTrans).normalize();
var eyeToVert = (cubeVertPos - cubeEyePos);
outReflectVec = reflect(eyeToVert, cubeNormal);
}
function fragment() {