From 72d683c1f2099c86901e4ba3899a993a34290728 Mon Sep 17 00:00:00 2001 From: any Date: Sun, 26 Jul 2026 17:54:45 +0200 Subject: [PATCH] raytracer fr eine sphere ist fertig, aber das gerenderte bild sieht komisch aus, als wrden zeilen verschoben werden und keine kugel ist zu erkennen. ausserdem gibt es jetzt vektor operationen wie das skalarprodukt. --- CMakeLists.txt | 7 ++-- collosion.h => collision.h | 0 examples.c | 66 +++++++++++++++++++++++++++++++++++++ examples.h | 11 ++----- main.c | 9 ++++- raytrace.c | 17 ++++++++++ raytrace.h | 4 +++ structs.h | 10 ++++-- test.png | Bin 40127 -> 67667 bytes vectorOp.c | 24 ++++++++++++++ vectorOp.h | 16 +++++++++ 11 files changed, 150 insertions(+), 14 deletions(-) rename collosion.h => collision.h (100%) create mode 100644 raytrace.h create mode 100644 vectorOp.c create mode 100644 vectorOp.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 21668cb..84d028a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,5 +12,8 @@ add_executable(Raytracer main.c Collision.c Collision.c Collision.c - collosion.h - raytrace.c) + collision.h + raytrace.c + raytrace.h + vectorOp.c + vectorOp.h) diff --git a/collosion.h b/collision.h similarity index 100% rename from collosion.h rename to collision.h diff --git a/examples.c b/examples.c index dc5f114..586f51d 100644 --- a/examples.c +++ b/examples.c @@ -3,6 +3,10 @@ // #include "examples.h" +#include "structs.h" +#include "vectorOp.h" +#include "raytrace.h" +#include void example_color(int width, int height, int channels, unsigned char *image) { for (int i = 0; i < height * width; i++) { @@ -17,3 +21,65 @@ void example_color(int width, int height, int channels, unsigned char *image) { } } } + +void exampleSphere(int height, int width, int channels, unsigned char *image) { + camera cam1; + cam1.origin.x = 0; + cam1.origin.y = 0; + cam1.origin.z = 0; + cam1.direction.x = 0; + cam1.direction.y = 0; + cam1.direction.z = 1; + cam1.resolutionX = width; + cam1.resolutionY = height; + cam1.screenDistance = 1; + cam1.width = 1.920; + cam1.height = 1.080; + vec3 sphereOrigin = (vec3){0,0,5}; + double sphereRadius = 1.0; + sphere obj = (sphere){sphereOrigin, sphereRadius}; + + vec3 worldUp = (vec3){0, 1, 0}; + vec3 screenX = vec3Cross(worldUp, cam1.direction); + vec3 screenY = vec3Cross(screenX, cam1.direction); + vec3 screenMiddlePoint = vec3Add(cam1.origin, vec3Scale(cam1.direction, cam1.screenDistance)); + vec3 screenTopLeft = vec3Add( + vec3Add(screenMiddlePoint, + vec3Scale(screenY, cam1.height)), + vec3Scale(screenX, cam1.width) + ); + double pixelStepX = cam1.width / cam1.resolutionX; + double pixelStepY = cam1.height / cam1.resolutionY; + vec3 vecPixelStepX = vec3Scale(screenX, pixelStepX); + vec3 vecPixelStepY = vec3Scale(screenY, pixelStepY); + for (int i = 0; i < height * width; i++) { + int step = i *channels; + int x = i % width; + int y = i / width; + RGBA pixelColor; + + vec3 *pixelOrigin = (vec3 *)malloc(sizeof(vec3)); + *pixelOrigin = vec3Add(screenTopLeft, + vec3Add( + vec3Scale(vecPixelStepX, x), + vec3Scale(vecPixelStepY, y) + ) + ); + + ray *lightRay = (ray *)malloc(sizeof(ray));; + lightRay->origin = cam1.origin; + + lightRay->direction = vec3Subtract(*pixelOrigin, cam1.origin); + + pixelColor = raytraceSphere(&obj, lightRay); + free(pixelOrigin); + free(lightRay); + + image[step] = (int)(pixelColor.r * 255.0); + image[step+1] = 0; + image[step+2] = 0; + if (channels == 4) { + image[step+3] = 255; + } + } +} diff --git a/examples.h b/examples.h index 6dd67ab..7fc85b1 100644 --- a/examples.h +++ b/examples.h @@ -1,9 +1,2 @@ -// -// Created by ary on 19.07.2026. -// - -#ifndef RAYTRACER_EXAMPLES_H -#define RAYTRACER_EXAMPLES_H - -#endif //RAYTRACER_EXAMPLES_H -void example_color(int, int, int, unsigned char *); \ No newline at end of file +void example_color(int, int, int, unsigned char *); +void exampleSphere(int, int, int, unsigned char *); \ No newline at end of file diff --git a/main.c b/main.c index 480c556..bcd69eb 100644 --- a/main.c +++ b/main.c @@ -10,6 +10,8 @@ #include #define MAXJSONSIZE (100 * 1024) #include "structs.h" +#include "collision.h" +#include "raytrace.h" int main() { int width = 1280; int height = 780; @@ -23,7 +25,12 @@ int main() { rawJSON[i] = ch; cJSON *szene = cJSON_Parse(rawJSON); - example_color(width, height, channels, image); + + + //example_color(width, height, channels, image); + exampleSphere(width, height, channels, image); + + stbi_write_png("C:/Users/ary/CLionProjects/Raytracer/test.png", width, height, channels, image, width * channels); free(image); diff --git a/raytrace.c b/raytrace.c index e69de29..b967db5 100644 --- a/raytrace.c +++ b/raytrace.c @@ -0,0 +1,17 @@ +#include "structs.h" +#include "collision.h" +#include "vectorOp.h" + +RGBA raytraceSphere(sphere *obj, ray *lightray) { + RGBA pixel; + pixel.r = 0; + pixel.g = 0; + pixel.b = 0; + pixel.a = 1; + + vec3 collisionPoint = collisionPointSphere(lightray, obj); + vec3 sphereNormal = vec3Normalize(vec3Subtract(collisionPoint, obj->origin)); + pixel.r = -vec3Product(sphereNormal, lightray->direction); + return pixel; + +} \ No newline at end of file diff --git a/raytrace.h b/raytrace.h new file mode 100644 index 0000000..471bef8 --- /dev/null +++ b/raytrace.h @@ -0,0 +1,4 @@ +#pragma once +#include "structs.h" + +RGBA raytraceSphere(sphere *, ray *); diff --git a/structs.h b/structs.h index 7974b95..129577d 100644 --- a/structs.h +++ b/structs.h @@ -1,3 +1,4 @@ +#pragma once struct vec3 { double x, y, z; }; @@ -15,7 +16,7 @@ struct ray { struct sphere { vec3 origin; - int radius; + double radius; }; typedef struct sphere sphere; struct camera { @@ -25,4 +26,9 @@ struct camera { double width; double resolutionX; double resolutionY; -}; typedef struct camera camera; \ No newline at end of file + double screenDistance; +}; typedef struct camera camera; + +struct rgba { + double r, g, b, a; +}; typedef struct rgba RGBA; \ No newline at end of file diff --git a/test.png b/test.png index 2e8dcc7135ac1aeeb38ec64b6272003c0a086186..12a17ad53c4a33ae715f3aafe0e4192c298cf539 100644 GIT binary patch literal 67667 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 z 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 literal 40127 zcmeI5&r4KM6vyw3Gc`^+NDxe7{#fLuu$PQ5L`A91B#~qYL6E%2-~}x-T$n8!TZ|R2 zDQFQy&|>zs3lfVVL2?l>v}z+l5`l{%`nl1b^B3H67netVTs&P2^PcbBckkz%@AsU0 z_uOE=b=BLL?TP0;yzyRUFLtFiZ;WS3`SsV;?zU>A_1e!BZ=>zq zX8G^*=-PB=amZoW=5C8-K0kXU^nE-jX1q6gPfs7o09Dp1k zlq-<~tN^;DWdk_?IRH68=vKfJ5L%=&&>isv;0eGJAatOS2_O?7_EF#o2&mFQ7oM`A~<+NfH6(^i2L%LdDaIO!e~ zBT7rR45|YRiV=w&i5-a@i5-a@i5+#z%l)9bKBz3Gs7zGEZ>u^02#^m=RAf|SG67@) z$OLG&*Z~3(K2|cUWFgJ#7&wq=FGG77+RI3zTI2wExMd*KQCV)Ka0NL4IRH5TIRH5T zIRH68zXdLt05Sn&0xUFvwqp#W(JYN-#rigx05Sm>1BKQ2mhw6V%LbkRJOOwD@C0mQ zPk@P)EIuiYgV>}btknUi$nvxXu_Lh~v7>B*GyLQvkmWNiv7;4F01zM_nm_;$00aO5 zT6?J0_FCQANEHZ>&$K`Q5Fk#|8pr_#o>d?K2mk_r03e{E>nC+mGgagOllbT69&yJ*{O`3%EaDidd#(m@0r27Nu$}U zjRZ1&a{T1tah43LxB~>Jl9W%U>VW|9f(8Tt0m~GX6-C(-J4j~`J8t_Pa|U*msa@Yl dAj=ZSO0_?${~Y_+bw>q11E&W2=X%}S{{VODeQp2% diff --git a/vectorOp.c b/vectorOp.c new file mode 100644 index 0000000..04f92ed --- /dev/null +++ b/vectorOp.c @@ -0,0 +1,24 @@ +#include "structs.h" +#include "math.h" +vec3 vec3Add(vec3 a, vec3 b) { + return (vec3){a.x + b.x, a.y + b.y, a.z + b.z}; +} +vec3 vec3Subtract(vec3 a, vec3 b) { + return (vec3){a.x - b.x, a.y - b.y, a.z - b.z}; +} +vec3 vec3Scale(vec3 vector, double scalar) { + return (vec3){vector.x * scalar, vector.y * scalar, vector.z * scalar}; +} +double vec3Product(vec3 a, vec3 b) { + return (a.x * b.x + a.y * b.y + a.z * b.z); +} +double vec3Length(vec3 vector) { + return sqrt(vector.x * vector.x + vector.y * vector.y + vector.z * vector.z); +} +vec3 vec3Normalize(vec3 vector) { + double length = vec3Length(vector); + return (vec3){vector.x / length, vector.y / length, vector.z / length}; +} +vec3 vec3Cross(vec3 a, vec3 b) { + return (vec3){a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x}; +} \ No newline at end of file diff --git a/vectorOp.h b/vectorOp.h new file mode 100644 index 0000000..8b325e3 --- /dev/null +++ b/vectorOp.h @@ -0,0 +1,16 @@ +#pragma once +#include "structs.h" + +vec3 vec3Add(vec3, vec3); + +vec3 vec3Subtract(vec3, vec3); + +vec3 vec3Scale(vec3, double); + +double vec3Product(vec3, vec3); + +double vec3Length(vec3); + +vec3 vec3Normalize(vec3); + +vec3 vec3Cross(vec3 a, vec3 b);