fixed BARYCENTRIC_CALCULATE because it was actually stemming from not using the actual camera UBO used to render the scene (even though nsight showed the values matching so who knows)

This commit is contained in:
ecker 2026-05-13 23:43:21 -05:00
parent dc192064b1
commit 2afcacc9e1
8 changed files with 58 additions and 45 deletions

View File

@ -120,7 +120,7 @@
"hdr": true,
"vxgi": false, // to-do: fix issues
"culling": false,
"bloom": true,
"bloom": false,
"dof": false,
"rt": false,
"fsr": false,

View File

@ -316,7 +316,7 @@ void populateSurfaceMaterial() {
}
#endif
{
surface.normal.eye = normalize(vec3( ubo.eyes[surface.pass].view * vec4(surface.normal.world, 0.0) ));
surface.normal.eye = normalize(vec3( VIEW_MATRIX * vec4(surface.normal.world, 0.0) ));
}
surface.light *= surface.material.albedo;
@ -425,13 +425,13 @@ void populateSurface( InstanceAddresses instanceAddresses, uvec3 indices ) {
#if 0 && BARYCENTRIC_CALCULATE
{
surface.position.world = vec3( surface.object.model * vec4(triangle.point.position, 1.0 ) );
surface.position.eye = vec3( ubo.eyes[surface.pass].view * vec4(surface.position.world, 1.0) );
surface.position.eye = vec3( VIEW_MATRIX * vec4(surface.position.world, 1.0) );
}
#endif
// bind normals
{
surface.normal.world = normalize(vec3( surface.object.model * vec4(triangle.point.normal, 0.0 ) ));
// surface.normal.eye = vec3( ubo.eyes[surface.pass].view * vec4(surface.normal.world, 0.0) );
// surface.normal.eye = vec3( VIEW_MATRIX * vec4(surface.normal.world, 0.0) );
}
// bind UVs
{

View File

@ -21,7 +21,11 @@
#define MAX_SHADOWS ubo.settings.lighting.maxShadows
#endif
#ifndef VIEW_MATRIX
#if VXGI
#define VIEW_MATRIX ubo.eyes[surface.pass].view
#else
#define VIEW_MATRIX camera.viewport[surface.pass].view
#endif
#endif
// implicit shader settings
@ -76,7 +80,7 @@
#endif
#if BARYCENTRIC
#ifndef BARYCENTRIC_CALCULATE
#define BARYCENTRIC_CALCULATE 0
#define BARYCENTRIC_CALCULATE 1
#endif
#ifndef BUFFER_REFERENCE
#define BUFFER_REFERENCE 1

View File

@ -71,7 +71,7 @@ void pbr() {
if ( light.power <= LIGHT_POWER_CUTOFF ) continue;
if ( surface.material.lightmapped && light.type >= 0 ) continue;
const vec3 Liu = vec3(ubo.eyes[surface.pass].view * vec4(light.position, 1)) - surface.position.eye;
const vec3 Liu = vec3(camera.viewport[surface.pass].view * vec4(light.position, 1)) - surface.position.eye;
const float Ld = length(Liu);
const float La = 1.0 / (1 + (PI * pow(Ld, 2.0)));
if ( La <= LIGHT_POWER_CUTOFF ) continue;

View File

@ -61,43 +61,46 @@ layout( push_constant ) uniform PushBlock {
#include "../../../common/structs.h"
layout (binding = 10) uniform UBO {
layout (binding = 10) uniform Camera {
Viewport viewport[2];
} camera;
layout (binding = 11) uniform UBO {
EyeMatrices eyes[2];
Settings settings;
} ubo;
/*
*/
layout (std140, binding = 11) readonly buffer DrawCommands {
layout (std140, binding = 12) readonly buffer DrawCommands {
DrawCommand drawCommands[];
};
layout (std140, binding = 12) readonly buffer Instances {
layout (std140, binding = 13) readonly buffer Instances {
Instance instances[];
};
layout (std140, binding = 13) readonly buffer InstanceAddresseses {
layout (std140, binding = 14) readonly buffer InstanceAddresseses {
InstanceAddresses instanceAddresses[];
};
layout (std140, binding = 14) readonly buffer Objects {
layout (std140, binding = 15) readonly buffer Objects {
Object objects[];
};
layout (std140, binding = 15) readonly buffer Materials {
layout (std140, binding = 16) readonly buffer Materials {
Material materials[];
};
layout (std140, binding = 16) readonly buffer Textures {
layout (std140, binding = 17) readonly buffer Textures {
Texture textures[];
};
layout (std140, binding = 17) readonly buffer Lights {
layout (std140, binding = 18) readonly buffer Lights {
Light lights[];
};
layout (binding = 18) uniform sampler2D samplerTextures[TEXTURES];
layout (binding = 19) uniform samplerCube samplerCubemaps[CUBEMAPS];
layout (binding = 20) uniform sampler3D samplerNoise;
layout (binding = 19) uniform sampler2D samplerTextures[TEXTURES];
layout (binding = 20) uniform samplerCube samplerCubemaps[CUBEMAPS];
layout (binding = 21) uniform sampler3D samplerNoise;
#if VXGI
layout (binding = 21) uniform sampler3D voxelOutput[CASCADES];
layout (binding = 22) uniform sampler3D voxelOutput[CASCADES];
#endif
#if RT
layout (binding = 22) uniform accelerationStructureEXT tlas;
layout (binding = 23) uniform accelerationStructureEXT tlas;
#endif
#if BUFFER_REFERENCE
@ -195,24 +198,26 @@ void populateSurface() {
float depth = 0.0;
{
vec2 inUv = (vec2(gl_GlobalInvocationID.xy) / vec2(renderSize)) * 2.0f - 1.0f;
const mat4 iProjectionView = inverse( ubo.eyes[surface.pass].projection * mat4(mat3(ubo.eyes[surface.pass].view)) );
const mat4 iProjection = inverse( camera.viewport[surface.pass].projection );
const mat4 iView = inverse( camera.viewport[surface.pass].view );
const mat4 iProjectionView = inverse( camera.viewport[surface.pass].projection * mat4(mat3(camera.viewport[surface.pass].view)) );
const vec4 near4 = iProjectionView * (vec4(inUv, -1.0, 1.0));
const vec4 far4 = iProjectionView * (vec4(inUv, 1.0, 1.0));
const vec3 near3 = near4.xyz / near4.w;
const vec3 far3 = far4.xyz / far4.w;
surface.ray.direction = normalize( far3 - near3 );
// surface.ray.origin = near3.xyz;
surface.ray.origin = ubo.eyes[surface.pass].eyePos.xyz;
// surface.ray.origin = vec3( -ubo.eyes[surface.pass].view[0][3], -ubo.eyes[surface.pass].view[1][3], -ubo.eyes[surface.pass].view[2][3] );
surface.ray.origin = near3.xyz; // eyePos.xyz
depth = IMAGE_LOAD(samplerDepth).r;
vec4 eye = ubo.eyes[surface.pass].iProjection * vec4(inUv, depth, 1.0);
vec4 eye = iProjection * vec4(inUv, depth, 1.0);
eye /= eye.w;
surface.position.eye = eye.xyz;
surface.position.world = vec3( ubo.eyes[surface.pass].iView * eye );
surface.position.world = vec3( iView * eye );
}

View File

@ -34,38 +34,42 @@ layout (binding = 0) uniform accelerationStructureEXT tlas;
layout (binding = 1, rgba32f) uniform image2D outImage;
layout (binding = 2) uniform UBO {
layout (binding = 2) uniform Camera {
Viewport viewport[2];
} camera;
layout (binding = 3) uniform UBO {
EyeMatrices eyes[2];
Settings settings;
} ubo;
layout (std140, binding = 3) readonly buffer Instances {
layout (std140, binding = 4) readonly buffer Instances {
Instance instances[];
};
layout (std140, binding = 4) readonly buffer InstanceAddresseses {
layout (std140, binding = 5) readonly buffer InstanceAddresseses {
InstanceAddresses instanceAddresses[];
};
layout (std140, binding = 5) readonly buffer Objects {
layout (std140, binding = 6) readonly buffer Objects {
Object objects[];
};
layout (std140, binding = 6) readonly buffer Materials {
layout (std140, binding = 7) readonly buffer Materials {
Material materials[];
};
layout (std140, binding = 7) readonly buffer Textures {
layout (std140, binding = 8) readonly buffer Textures {
Texture textures[];
};
layout (std140, binding = 8) readonly buffer Lights {
layout (std140, binding = 9) readonly buffer Lights {
Light lights[];
};
layout (binding = 9) uniform sampler2D samplerTextures[TEXTURES];
layout (binding = 10) uniform samplerCube samplerCubemaps[CUBEMAPS];
layout (binding = 11) uniform sampler3D samplerNoise;
layout (binding = 10) uniform sampler2D samplerTextures[TEXTURES];
layout (binding = 11) uniform samplerCube samplerCubemaps[CUBEMAPS];
layout (binding = 12) uniform sampler3D samplerNoise;
#if VXGI
layout (binding = 12) uniform usampler3D voxelId[CASCADES];
layout (binding = 13) uniform sampler3D voxelNormal[CASCADES];
layout (binding = 14) uniform sampler3D voxelRadiance[CASCADES];
layout (binding = 13) uniform usampler3D voxelId[CASCADES];
layout (binding = 14) uniform sampler3D voxelNormal[CASCADES];
layout (binding = 15) uniform sampler3D voxelRadiance[CASCADES];
#endif
layout (location = 0) rayPayloadEXT RayTracePayload payload;

View File

@ -15,7 +15,7 @@
#define USE_SHARED_PIPELINES 0
#define VK_DEBUG_VALIDATION_MESSAGE(...)\
// VK_VALIDATION_MESSAGE(x);
VK_VALIDATION_MESSAGE(__VA_ARGS__);
namespace {
uint32_t VERTEX_BUFFER_BIND_ID = 0;
@ -871,7 +871,7 @@ void ext::vulkan::DescriptorSet::update( const Graphic& graphic, const GraphicDe
for ( size_t i = 0; i < descriptor.descriptorCount; ++i ) {
if ( descriptor.pBufferInfo ) {
if ( descriptor.pBufferInfo[i].offset % device->properties.limits.minUniformBufferOffsetAlignment != 0 ) {
// VK_DEBUG_VALIDATION_MESSAGE("Invalid descriptor for buffer: " << descriptor.pBufferInfo[i].buffer << " (Offset: " << descriptor.pBufferInfo[i].offset << ", Range: " << descriptor.pBufferInfo[i].range << "), invalidating...");
VK_DEBUG_VALIDATION_MESSAGE("Invalid descriptor for buffer: {} (Offset: {}, Range: {}), invalidating...", (void*) descriptor.pBufferInfo[i].buffer, descriptor.pBufferInfo[i].offset, descriptor.pBufferInfo[i].range);
goto PIPELINE_UPDATE_INVALID;
}
}

View File

@ -21,7 +21,7 @@
#if BARYCENTRIC
// 0 keeps a buffer for barycentric coordinates, 1 will reconstruct in the deferred pass
#ifndef BARYCENTRIC_CALCULATE
#define BARYCENTRIC_CALCULATE 0
#define BARYCENTRIC_CALCULATE 1
#endif
#endif
@ -507,7 +507,7 @@ void ext::vulkan::DeferredRenderMode::build( bool resized ) {
auto& shader = blitter.material.getShader(DEFERRED_MODE, "deferred");
shader.metadata.aliases.buffers.clear();
// shader.aliasBuffer( storage.buffers.camera );
shader.aliasBuffer( storage.buffers.camera );
// shader.aliasBuffer( storage.buffers.joint );
shader.aliasBuffer( storage.buffers.drawCommands );
shader.aliasBuffer( storage.buffers.instance );