Browse Source

updated some stuff

IverMartinson 8 months ago
parent
commit
0b69b0b123

BIN
builds/final binaries/librasteriver.so


BIN
builds/final binaries/main.bin


+ 12 - 0
objects/rotated_cube.mtl

@@ -0,0 +1,12 @@
+# Blender 4.4.3 MTL File: 'None'
+# www.blender.org
+
+newmtl Material
+Ns 250.000000
+Ka 1.000000 1.000000 1.000000
+Kd 0.800000 0.800000 0.800000
+Ks 0.500000 0.500000 0.500000
+Ke 0.000000 0.000000 0.000000
+Ni 1.450000
+d 1.000000
+illum 2

+ 46 - 0
objects/rotated_cube.obj

@@ -0,0 +1,46 @@
+# Blender 4.4.3
+# www.blender.org
+mtllib rotated_cube.mtl
+o Cube
+v 1.636202 0.478275 -0.306753
+v 0.377775 -0.271598 -1.668389
+v 1.069844 -0.932032 0.993353
+v -0.188583 -1.681905 -0.368283
+v 0.188583 1.681905 0.368283
+v -1.069844 0.932032 -0.993353
+v -0.377775 0.271598 1.668389
+v -1.636202 -0.478275 0.306753
+vn 0.6292 0.3749 0.6808
+vn -0.2832 -0.7052 0.6501
+vn -0.7238 0.6018 0.3375
+vn -0.6292 -0.3749 -0.6808
+vn 0.7238 -0.6018 -0.3375
+vn 0.2832 0.7052 -0.6501
+vt 0.875000 0.500000
+vt 0.625000 0.750000
+vt 0.625000 0.500000
+vt 0.375000 1.000000
+vt 0.375000 0.750000
+vt 0.625000 0.000000
+vt 0.375000 0.250000
+vt 0.375000 0.000000
+vt 0.375000 0.500000
+vt 0.125000 0.750000
+vt 0.125000 0.500000
+vt 0.625000 0.250000
+vt 0.875000 0.750000
+vt 0.625000 1.000000
+s 0
+usemtl Material
+f 5/1/1 3/2/1 1/3/1
+f 3/2/2 8/4/2 4/5/2
+f 7/6/3 6/7/3 8/8/3
+f 2/9/4 8/10/4 6/11/4
+f 1/3/5 4/5/5 2/9/5
+f 5/12/6 2/9/6 6/7/6
+f 5/1/1 7/13/1 3/2/1
+f 3/2/2 7/14/2 8/4/2
+f 7/6/3 5/12/3 6/7/3
+f 2/9/4 4/5/4 8/10/4
+f 1/3/5 3/2/5 4/5/5
+f 5/12/6 1/3/6 2/9/6

+ 66 - 22
src/RasterIver/headers/master_kernel.h

@@ -31,14 +31,15 @@ void norm(float dest[2], float a[2]){ \
     dest[1] = a[1] + b[1]; \
 } \
 \
-__kernel void raster_kernel(__global int* objects, __global float* verticies, __global float* normals, __global float* uvs, __global int* triangles, __global uint* frame_buffer, int object_count, int width, int height, int show_z_buffer, float highest_z){ \
+__kernel void raster_kernel(__global int* objects, __global float* verticies, __global float* normals, __global float* uvs, __global int* triangles, __global uint* frame_buffer, int object_count, int width, int height, int show_z_buffer){ \
     int id_x = get_global_id(0); \
     int id_y = get_global_id(1); \
     \
     float z_pixel = 0; \
     uint frame_pixel = 0x22222222; \
     \
-    float biggest_z = 0;\
+    float highest_z = 800;\
+    float lowest_z = 400;\
     \
     for (int object = 0; object < object_count; object++){ \
         int base = object * 15;\
@@ -56,6 +57,8 @@ __kernel void raster_kernel(__global int* objects, __global float* verticies, __
         int triangle_count = objects[base + 9];\
         int triangle_index = objects[base + 10];\
         int vertex_index = objects[base + 11];\
+        int normal_index = objects[base + 12];\
+        int uv_index = objects[base + 13];\
         int texture_index = objects[base + 14];\
         \
         for (int triangle = 0; triangle < triangle_count; triangle++){\
@@ -64,6 +67,14 @@ __kernel void raster_kernel(__global int* objects, __global float* verticies, __
             int i0 = (vertex_index + triangles[triangle_base + 0]) * 3;\
             int i1 = (vertex_index + triangles[triangle_base + 1]) * 3;\
             int i2 = (vertex_index + triangles[triangle_base + 2]) * 3;\
+\
+            int i3 = (normal_index + triangles[triangle_base + 3]) * 3;\
+            int i4 = (normal_index + triangles[triangle_base + 4]) * 3;\
+            int i5 = (normal_index + triangles[triangle_base + 5]) * 3;\
+\
+            int i6 = (uv_index + triangles[triangle_base + 6]) * 3;\
+            int i7 = (uv_index + triangles[triangle_base + 7]) * 3;\
+            int i8 = (uv_index + triangles[triangle_base + 8]) * 3;\
             \
             float x0 = verticies[i0 + 0] * object_s_x + object_x;\
             float y0 = verticies[i0 + 1] * object_s_y + object_y;\
@@ -77,6 +88,35 @@ __kernel void raster_kernel(__global int* objects, __global float* verticies, __
             float y2 = verticies[i2 + 1] * object_s_y + object_y;\
             float z2 = verticies[i2 + 2] * object_s_z + object_z;\
             \
+            float n_x0 = normals[i3 + 0];\
+            float n_y0 = normals[i3 + 1];\
+            float n_z0 = normals[i3 + 2];\
+            \
+            float n_x1 = normals[i4 + 0];\
+            float n_y1 = normals[i4 + 1];\
+            float n_z1 = normals[i4 + 2];\
+            \
+            float n_x2 = normals[i5 + 0];\
+            float n_y2 = normals[i5 + 1];\
+            float n_z2 = normals[i5 + 2];\
+            \
+            float u_x0 = uvs[i6 + 0];\
+            float u_y0 = uvs[i6 + 1];\
+            float u_z0 = uvs[i6 + 2];\
+            \
+            float u_x1 = uvs[i7 + 0];\
+            float u_y1 = uvs[i7 + 1];\
+            float u_z1 = uvs[i7 + 2];\
+            \
+            float u_x2 = uvs[i8 + 0];\
+            float u_y2 = uvs[i8 + 1];\
+            float u_z2 = uvs[i8 + 2];\
+            \
+            int has_normals = 1;\
+            if (i3 < 0 || i4 < 0 || i5 < 0){\
+                has_normals = 0;\
+            }\
+            \
             if (isinf(x0) || isinf(y0) || isinf(z0) || isinf(x1) || isinf(y1) || isinf(z1) || isinf(x2) || isinf(y2) || isinf(z2)){\
                 continue;\
             }\
@@ -119,40 +159,44 @@ __kernel void raster_kernel(__global int* objects, __global float* verticies, __
                 } \
                 \
                 float denominator = (y1 - y2) * (x0 - x2) + (x2 - x1) * (y0 - y2); \
+                \
+                if (denominator <= 0) { \
+                    continue; \
+                } \
                 float w0 = ((y1 - y2) * (id_x - x2) + (x2 - x1) * (id_y - y2)) / denominator; \
                 float w1 = ((y2 - y0) * (id_x - x0) + (x0 - x2) * (id_y - y2)) / denominator; \
                 float w2 = 1.0 - w0 - w1; \
                 \
-                if (denominator < 0) { \
-                    w0 = -w0; \
-                    w1 = -w1; \
-                    w2 = -w2; \
-                    denominator = -denominator; \
-                } \
-                \
                 float z = w0 * z0 + w1 * z1 + w2 * z2; \
                 \
-                if (z < 0){ \
-                    z *= -1; \
-                } \
-                \
                 if (z > z_pixel){ \
                     z_pixel = z; \
+                    \
+                    float nx = w0 * n_x0 + w1 * n_x1 + w2 * n_x2;\
+                    float ny = w0 * n_y0 + w1 * n_y1 + w2 * n_y2;\
+                    float nz = w0 * n_z0 + w1 * n_z1 + w2 * n_z2;\
+                    \
+                    uchar r = (uchar)((nx * 0.5f + 0.5f) * 255.0f);\
+                    uchar g = (uchar)((ny * 0.5f + 0.5f) * 255.0f);\
+                    uchar b = (uchar)((nz * 0.5f + 0.5f) * 255.0f);\
+                    \
+                    if (!has_normals){\
+                        r = 20;\
+                        g = 20;\
+                        b = 20;\
+                    }\
+                    \
+                    frame_pixel = 0xFF000000 | (r << 16) | (g << 8) | b;\
+                    \
                 } \
-                \
-                else { \
-                    continue; \
-                } \
-\
-                frame_pixel = 0xFFFFFFFF / triangle_count * (triangle + 1); \
-            } \
+            }\
         }\
     }\
     \
     if (id_y * width + id_x >= width * height){\
         return;\
     }\
-    frame_buffer[id_y * width + id_x] = frame_pixel; \
+    frame_buffer[(height - id_y) * width + id_x] = frame_pixel; \
     \
     if (!show_z_buffer){\
         return;\
@@ -164,5 +208,5 @@ __kernel void raster_kernel(__global int* objects, __global float* verticies, __
     \
     uchar intensity = (uchar)(norm_z * 255.0f);\
     \
-    frame_buffer[id_y * width + id_x] = 0xFF000000 | (intensity << 16) | (intensity << 8) | intensity;\
+    frame_buffer[(height - id_y) * width + id_x] = 0xFF000000 | (intensity << 16) | (intensity << 8) | intensity;\
 }\n";

+ 32 - 12
src/RasterIver/source code/rasteriver.c

@@ -404,17 +404,17 @@ load_object_return load_object(char *object_path, int object_offset, int base){
                 &triangles[(ct + loading_object_current_faces_count) * ts + 2], &triangles[(ct + loading_object_current_faces_count) * ts + 5], &triangles[(ct + loading_object_current_faces_count) * ts + 8]);
 
             if (matches != 9){
-                triangles[(ct + loading_object_current_faces_count) * ts + 0] = -1;
-                triangles[(ct + loading_object_current_faces_count) * ts + 1] = -1;
-                triangles[(ct + loading_object_current_faces_count) * ts + 2] = -1;
+                triangles[(ct + loading_object_current_faces_count) * ts + 0] = -100;
+                triangles[(ct + loading_object_current_faces_count) * ts + 1] = -100;
+                triangles[(ct + loading_object_current_faces_count) * ts + 2] = -100;
                 
-                triangles[(ct + loading_object_current_faces_count) * ts + 3] = -1;
-                triangles[(ct + loading_object_current_faces_count) * ts + 4] = -1;
-                triangles[(ct + loading_object_current_faces_count) * ts + 5] = -1;
+                triangles[(ct + loading_object_current_faces_count) * ts + 3] = -100;
+                triangles[(ct + loading_object_current_faces_count) * ts + 4] = -100;
+                triangles[(ct + loading_object_current_faces_count) * ts + 5] = -100;
                 
-                triangles[(ct + loading_object_current_faces_count) * ts + 6] = -1;
-                triangles[(ct + loading_object_current_faces_count) * ts + 7] = -1;
-                triangles[(ct + loading_object_current_faces_count) * ts + 8] = -1;
+                triangles[(ct + loading_object_current_faces_count) * ts + 6] = -100;
+                triangles[(ct + loading_object_current_faces_count) * ts + 7] = -100;
+                triangles[(ct + loading_object_current_faces_count) * ts + 8] = -100;
 
                 if (strchr(line, '/')){
                     obj_face_type = 1;
@@ -811,7 +811,6 @@ RI_result RI_Tick(){
             erchk(clSetKernelArg(compiled_kernel_master, 7, sizeof(int), (void*)&width));
             erchk(clSetKernelArg(compiled_kernel_master, 8, sizeof(int), (void*)&height));
             erchk(clSetKernelArg(compiled_kernel_master, 9, sizeof(int), (void*)&show_z_buffer)); 
-            erchk(clSetKernelArg(compiled_kernel_master, 10, sizeof(float), (void*)&highest_z));
 
             if (object_count > 0) {
                 erchk(clEnqueueWriteBuffer(queue, object_memory_buffer, CL_TRUE, 0, sizeof(int) * object_size * object_count, objects, 0, NULL, NULL));
@@ -1197,8 +1196,18 @@ RI_result OpenCL_init(){
     erchk(error);
 
     error = clBuildProgram(kernel_program_non_master, 1, &device, NULL, NULL, NULL);
-    erchk(error);
+    if (error == -11){
+        size_t log_size;
+        clGetProgramBuildInfo(kernel_program_non_master, device, CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size);
+        
+        char *log = malloc(log_size);
+        clGetProgramBuildInfo(kernel_program_non_master, device, CL_PROGRAM_BUILD_LOG, log_size, log, NULL);
+        
+        fprintf(stderr, "Build log:\n%s\n", log);
+        free(log);            
 
+        RI_Stop(0);
+    }
     compiled_kernel_non_master = clCreateKernel(kernel_program_non_master, "raster_kernel", &error);
     erchk(error);
 
@@ -1207,7 +1216,18 @@ RI_result OpenCL_init(){
     erchk(error);
 
     error = clBuildProgram(kernel_program_master, 1, &device, NULL, NULL, NULL);
-    erchk(error);
+    if (error == -11){
+        size_t log_size;
+        clGetProgramBuildInfo(kernel_program_master, device, CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size);
+        
+        char *log = malloc(log_size);
+        clGetProgramBuildInfo(kernel_program_master, device, CL_PROGRAM_BUILD_LOG, log_size, log, NULL);
+        
+        fprintf(stderr, "Build log:\n%s\n", log);
+        free(log);            
+
+        RI_Stop(0);
+    }
 
     compiled_kernel_master = clCreateKernel(kernel_program_master, "raster_kernel", &error);
     erchk(error);

+ 4 - 4
src/launch program/main.c

@@ -15,7 +15,7 @@ int main(){
     RI_SetFlag(RI_FLAG_DEBUG_FPS, 0);
     RI_SetFlag(RI_FLAG_SHOW_FPS, 1);
     RI_SetFlag(RI_FLAG_SHOW_FRAME, 1);
-    RI_SetFlag(RI_FLAG_SHOW_Z_BUFFER, 0);
+    RI_SetFlag(RI_FLAG_SHOW_Z_BUFFER, 1);
     RI_SetFlag(RI_FLAG_CLEAN_POLYGONS, 1);
     RI_SetFlag(RI_FLAG_POPULATE_POLYGONS, 0);
     RI_SetFlag(RI_FLAG_BE_MASTER_RENDERER, 1);
@@ -27,9 +27,9 @@ int main(){
     }
 
     RI_newObject object_buffer[5] = {
-        {400, 400, 400, 0, 0, 0, 100, 100, 100, "objects/gourd.obj", "texture.png"},
-        {400, 400, 400, 0, 0, 0, 200, 200, 200, "objects/gordon_freeman.obj", "texture.png"},
-        {600, 400, 400, 0, 0, 0, 100, 100, 100, "objects/obj_file.obj", "texture.png"},
+        {200, 400, 400, 0, 0, 0, 100, 100, 100, "objects/gourd.obj", "texture.png"},
+        {400, 50, 400, 0, 0, 0, 400, 400, 400, "objects/gordon_freeman.obj", "texture.png"},
+        {600, 400, 300, 0, 0, 0, 100, 100, 100, "objects/rotated_cube.obj", "texture.png"},
         {400, 400, 400, 0, 0, 0, 100, 100, 100, "objects/obj_file.obj", "texture.png"},
         {400, 400, 400, 0, 0, 0, 100, 100, 100, "objects/obj_file.obj", "texture.png"},
     };