reflektionen mit den richtigen farben implementiert

This commit is contained in:
any
2026-07-29 21:47:10 +02:00
parent 1742d7d0f5
commit caced0f81e
2 changed files with 27 additions and 3 deletions
+27 -3
View File
@@ -6,8 +6,9 @@
RGBA raytraceSphere(sphere **objectList, ray *lightray) { RGBA raytraceSphere(sphere **objectList, ray *lightray) {
RGBA pixel = (RGBA){0,0,0,1}; RGBA pixel = (RGBA){0,0,0,1};
const int lightBounces = 1; const int lightBounces = 5;
sphere **spheresHitList = (sphere **)calloc( (lightBounces + 1),sizeof(sphere*) ); sphere **spheresHitList = (sphere **)calloc( (lightBounces + 1),sizeof(sphere*) );
vec3 *spheresNormalList = (vec3 *)calloc( lightBounces + 1,sizeof(vec3) );
int hitLightIndex = -1; int hitLightIndex = -1;
vec3 sphereNormal; vec3 sphereNormal;
@@ -32,7 +33,9 @@ RGBA raytraceSphere(sphere **objectList, ray *lightray) {
if (nearestSphere != nullptr) { if (nearestSphere != nullptr) {
sphereNormal = vec3Normalize(vec3Subtract(nearestCollisionPoint, nearestSphere->origin));////////////////////////////// optimize divide by sphere radius instead spheresHitList[j] = nearestSphere;
sphereNormal = vec3Scale(vec3Subtract(nearestCollisionPoint, nearestSphere->origin), 1/(nearestSphere->radius));////////////////////////////// optimize, schreibe divide vector funktion
spheresNormalList[j] = sphereNormal;
lightray->direction = vec3Add(lightray->direction, vec3Scale(sphereNormal, 2)); lightray->direction = vec3Add(lightray->direction, vec3Scale(sphereNormal, 2));
lightray->origin = nearestCollisionPoint; lightray->origin = nearestCollisionPoint;
} }
@@ -41,11 +44,32 @@ RGBA raytraceSphere(sphere **objectList, ray *lightray) {
} }
} }
int firstLightHitIndex = -1;
for (int i = 0; i <= lightBounces && spheresHitList[i] != nullptr; i++) {
if (spheresHitList[i]->isLight == 1) {
firstLightHitIndex = i;
break;
}
}
if (firstLightHitIndex == -1) {
pixel = (RGBA){0,0,0,1};
}
else
{ pixel = spheresHitList[firstLightHitIndex]->color;
for (int i = firstLightHitIndex - 1; i >= 0; i--) {
pixel.r = pixel.r * spheresHitList[i]->color.r;
pixel.g = pixel.g * spheresHitList[i]->color.g;
pixel.b = pixel.b * spheresHitList[i]->color.b;
pixel.a = pixel.a * spheresHitList[i]->color.a;
}
//pixel.r = -vec3Product(sphereNormal, lightray->direction); //pixel.r = -vec3Product(sphereNormal, lightray->direction);
pixel = (RGBA){1 - 0.5 *( sphereNormal.x + 1), 1 - 0.5 * (sphereNormal.y +1), 1 -0.5* (sphereNormal.z + 1),1}; //pixel = (RGBA){1 - 0.5 *( sphereNormal.x + 1), 1 - 0.5 * (sphereNormal.y +1), 1 -0.5* (sphereNormal.z + 1),1};
}
free(spheresHitList); free(spheresHitList);
free(spheresNormalList);
return pixel; return pixel;
} }
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

After

Width:  |  Height:  |  Size: 81 KiB