A 3D Rendering Engine

Iver Martinson 763e95a156 Merge pull request #5 from IverMartinson/fix_clip_tex 5 months ago
.vscode dfdcfd9b07 added semi out-of-view-polygon clipping, kernels no longer in strings 10 months ago
builds 732838abb6 first commit 10 months ago
diagrams 39a32d2cf3 commited untracked files 10 months ago
objects dfdcfd9b07 added semi out-of-view-polygon clipping, kernels no longer in strings 10 months ago
src c792b9c2b8 updated code 10 months ago
textures 0e25c4f966 fixed textures 10 months ago
.gitattributes d7447150bc added .gitattributes file 10 months ago
LICENSE.md f0fc1338dd updated and moved license 10 months ago
Makefile 2f8f04948b this looks cool 10 months ago
build 5e7402cb52 added helper scripts 10 months ago
dbg af060b7ad5 added obj parser and basic object functions/variables 11 months ago
readme.md c7a54c5625 Update readme.md 9 months ago
run af060b7ad5 added obj parser and basic object functions/variables 11 months ago
val dfdcfd9b07 added semi out-of-view-polygon clipping, kernels no longer in strings 10 months ago

readme.md

RasterIver, a Rendering Engine

animated

RasterIver?

Rasterizer + Iver = RasterIver

Features

(todo: write features)

RI_FLAG List

  • RI_FLAG_DEBUG Turns debugging on or off
  • RI_FLAG_DEBUG_LEVEL Indepth-ness of debugging
  • RI_FLAG_SHOW_BUFFER The "buffer" to render
  • RI_FLAG_SHOW_FPS Shows the FPS
  • RI_FLAG_DEBUG_FPS Prints FPS in the console
  • RI_FLAG_CLEAN_POLYGONS Clear the polygon array after RI_RequestPolyons is called
  • RI_FLAG_POPULATE_POLYGONS Sets random values in the polygon array
  • RI_FLAG_BE_MASTER_RENDERER Whether you want to use objects or to have direct access to the polygon array
  • RI_FLAG_SHOW_FRAME Shows the current frame #
  • RI_FLAG_DEBUG_FRAME Prints the current frame # in the console
  • RI_FLAG_SHOW_INFO Shows object info
  • RI_FLAG_DEBUG_TICK Turns debugging on or off for anything that would fill up the console when constantly ticking
  • RI_FLAG_USE_CPU Use the CPU over the GPU
  • RI_FLAG_HANDLE_SDL_EVENTS Whether RasterIver should handle SDL events

Requirements

To Run

  • SDL2
  • SDL2 TTF
  • OpenCL Runtimes

    To Build

  • SDL2

  • SDL2 TTF

  • OpenCL Developer Libraries

  • ROCm if using AMD

  • CUDA if using NVIDIA

Todo

  • make todo list
  • function to request a mesh. I.E., request a number of polygons/verticies (maybe from presets? planes, cubes, idk) and be able to edit them on the fly. Useful for dynamic terrain or something like that
  • texture support
  • fix interpolation issue with UV maps (and probably normals and Z values too)
  • fix horribly named variables in request object functions
  • include rasteriver.h in the kernels for better code updatability (i dont think you can do that)
  • make kernels not be in strings (read the file at compile time and put it inside rasteriver.c as a string? put it in a header like how it is now?)
  • change all iterator variables in for loops to have "i_" before it's variable name
  • add descriptions to RI functions
  • optimize object memory usage by not loading object data multiple times when the same object is requested
  • add checks for invalid/nonexistant files (files like object files & texture files)
  • perspective
  • euler rotation
  • quaternion rotation
  • sheer transform (and other fancy ones?)
  • simple lighting using normals
  • complex lighting using rays for shadows and stuff
  • polygon clipping by subdividing
  • flag for using CPU instead of GPU
  • actually acurate FPS cap
  • make an option for multiple cameras, or defining a camera. I want to be able to write it to a "texture" in menory and have objects use it as their texture
  • add shaders. Maybe have shader kernels? I have no idea how you would implement that but it sounds cool
  • make the returned array from RI_RequestObjects easier to write to I.E., not a 1D array. Maybe have it so you could do objects[obj #].x_position or something like that. I wonder if I could implement functions with that, too, so you could do objects.get_first_element()
  • object higherarchies (maybe not. This is moving towards game engine territory. Once I get this into a working release, I'll start working on a game engine)
  • deltaTime variable or function. (function that returns pointer? function that returns the last deltatime value?)
  • make a function to set a custom debug prefix
  • add multiple texture support for objects
  • add support for normal maps
  • add support for bump/height/displacement maps
  • add support for transparent textures
  • allow objects to have no texture
  • make checks for objects trying to have a texture, but no UV coords (generate them?)
  • FOV
  • add materials
  • make another kernel that calculated transforms & perspective before rasterizing
  • add ability to request objects multiple times
  • give objects IDs or some way to track them so that you can remove them dynamically
  • make CUDA version because OpenCL is slow with NVIDIA
  • [this wasn't actually a problem. I had -999999999 for r_w but switched how the inputs are. It was rotatiing things -99999999 rad and looked like it was off] fix center of perspective being in the wrong spot
  • make function for world scale/master scale (scales everything. from origin? from object origins?)
  • I think calculations for debugging memory usage are outdated/wrong
  • use correct types for stuff (like size_t)
  • add target resolution
  • find a faster way to draw pixels to the window
  • replace "RI_RequestObjects" with 2 functions, RI_CreateObject (which returns a pointer to the object) and RI_LoadObjectFile (which takes in an object file and a pointer). It'll be tough making the object data arrays basically dynamic, but it shouldn't be too hard. Maybe I'll make a termination sequence after each object's data points. Like [x, y, z..... NULL, 0, INFINITY, x, y, z......]. If I know the object I want to delete, I know the start and stopping points of all it's data points. All I have to do is cut them out. Is there a way to squish it back together though? Maybe I could shift all the other data points down, but if there is a substantial amount of them after the cut one, it could take forever.
  • antialiasing
  • fix gaps in thin lines
  • add "transformed" before verticies and normals memory buffers in main kernel to make it less confusing
  • add overdraw "buffer"
  • fix spaghetti code
  • add polygon clipping to GPU
  • add command line arguments like to select desired GPU