~ | Vertex normal obj handling

This commit is contained in:
TheRedShip
2025-02-24 20:19:06 +01:00
committed by tomoron
parent 30ca774491
commit 62d0863ff4
11 changed files with 108 additions and 50 deletions

View File

@ -55,7 +55,10 @@ struct GPUTriangle
vec3 position;
vec3 vertex1;
vec3 vertex2;
vec3 normal;
vec3 normal_vertex1;
vec3 normal_vertex2;
vec3 normal_vertex3;
vec2 texture_vertex1;
vec2 texture_vertex2;
@ -189,7 +192,8 @@ hitInfo traceBVH(Ray ray, GPUBvhData bvh_data, inout Stats stats)
{
hit.t = temp_hit.t;
hit.obj_index = bvh_data.triangle_start_index + node.index + i;
hit.normal = temp_hit.normal;
hit.u = temp_hit.u;
hit.v = temp_hit.v;
}
}
}
@ -260,8 +264,9 @@ hitInfo traverseBVHs(Ray ray, inout Stats stats)
vec3 position = transformedRay.origin + transformedRay.direction * temp_hit.t;
hit.position = inverseTransformMatrix * position + bvh_data.offset;
vec3 based_normal = triangle.normal * sign(-dot(transformedRay.direction, triangle.normal));
hit.normal = normalize(inverseTransformMatrix * based_normal);
vec3 normal = normalize(triangle.normal_vertex1 * (1.0 - hit.u - hit.v) + triangle.normal_vertex2 * hit.u + triangle.normal_vertex3 * hit.v);
vec3 directed_normal = normal * sign(-dot(transformedRay.direction, normal));
hit.normal = normalize(inverseTransformMatrix * directed_normal);
}
}

View File

@ -68,6 +68,7 @@ void main()
}
}
light *= (1.0 / totalWeight);
light.a = 1.0;
if (u_pass == u_pass_count - 1)
{
vec4 color = light * imageLoad(color_texture, pixel_coords);

View File

@ -102,10 +102,6 @@ bool intersectTriangle(Ray ray, GPUTriangle obj, out hitInfo hit)
hit.v >= 0.0 && (hit.u + hit.v) <= 1.0 &&
hit.t > 0.0;
// hit.position = ray.origin + ray.direction * t;
// hit.normal = obj.normal * sign(-dot(ray.direction, obj.normal));
// hit.normal = vec3(u, v, 1 - (u + v)); //texture mapping
return (valid);
}
@ -114,7 +110,6 @@ bool intersectTriangle(Ray ray, GPUObject obj, out hitInfo hit)
GPUTriangle tri;
tri.position = obj.position;
tri.normal = obj.normal;
tri.vertex1 = obj.vertex1;
tri.vertex2 = obj.vertex2;

View File

@ -30,7 +30,10 @@ struct GPUTriangle
vec3 position;
vec3 vertex1;
vec3 vertex2;
vec3 normal;
vec3 normal_vertex1;
vec3 normal_vertex2;
vec3 normal_vertex3;
vec2 texture_vertex1;
vec2 texture_vertex2;
@ -202,10 +205,10 @@ vec3[2] pathtrace(Ray ray, inout uint rng_state)
if (i == 0)
{
imageStore(normal_texture, ivec2(gl_GlobalInvocationID.xy), vec4(normalize(hit.normal), 1.0));
imageStore(position_texture, ivec2(gl_GlobalInvocationID.xy), vec4(normalize(hit.position), 1.0));
// vec4 accum_normal = accumulate(normal_texture, accum_normal, normalize(hit.normal));
// vec4 accum_position = accumulate(position_texture, accum_position, normalize(hit.position));
// imageStore(normal_texture, ivec2(gl_GlobalInvocationID.xy), vec4(normalize(hit.normal), 1.0));
// imageStore(position_texture, ivec2(gl_GlobalInvocationID.xy), vec4(normalize(hit.position), 1.0));
vec4 accum_normal = accumulate(normal_texture, accum_normal, normalize(hit.normal));
vec4 accum_position = accumulate(position_texture, accum_position, normalize(hit.position));
}
float p = max(color.r, max(color.g, color.b));

View File

@ -157,8 +157,9 @@ hitInfo traverseBVHs(Ray ray)
vec3 position = transformedRay.origin + transformedRay.direction * temp_hit.t;
hit.position = inverseTransformMatrix * position + bvh_data.offset;
vec3 based_normal = triangle.normal * sign(-dot(transformedRay.direction, triangle.normal));
hit.normal = normalize(inverseTransformMatrix * based_normal);
vec3 normal = normalize(triangle.normal_vertex1 * (1.0 - hit.u - hit.v) + triangle.normal_vertex2 * hit.u + triangle.normal_vertex3 * hit.v);
vec3 directed_normal = normal * sign(-dot(transformedRay.direction, normal));
hit.normal = normalize(inverseTransformMatrix * directed_normal);
}
}