diff --git a/fps.txt b/fps.txt deleted file mode 100644 index 8314797..0000000 --- a/fps.txt +++ /dev/null @@ -1,2661 +0,0 @@ -185 -148 -185 -154 -101 -189 -158 -139 -135 -124 -123 -138 -145 -163 -108 -131 -156 -144 -163 -182 -162 -148 -174 -117 -201 -188 -166 -157 -180 -120 -224 -138 -218 -160 -160 -128 -225 -160 -180 -178 -145 -150 -236 -158 -164 -160 -140 -208 -158 -166 -164 -147 -142 -180 -157 -185 -181 -145 -112 -154 -131 -153 -172 -154 -166 -115 -188 -214 -191 -183 -154 -150 -166 -176 -166 -172 -198 -156 -153 -137 -227 -151 -168 -151 -153 -174 -162 -181 -188 -148 -169 -154 -179 -155 -167 -178 -173 -152 -180 -173 -162 -176 -172 -156 -168 -172 -167 -157 -144 -186 -142 -178 -162 -166 -161 -181 -144 -180 -148 -162 -167 -155 -169 -168 -174 -157 -174 -141 -176 -142 -189 -170 -175 -159 -157 -131 -175 -165 -168 -154 -170 -153 -166 -170 -172 -139 -160 -160 -185 -197 -146 -147 -170 -160 -179 -196 -153 -133 -136 -151 -154 -151 -147 -165 -127 -156 -181 -140 -130 -126 -144 -159 -135 -127 -118 -141 -168 -133 -136 -122 -132 -149 -164 -120 -103 -158 -158 -138 -118 -111 -127 -141 -128 -129 -113 -124 -149 -134 -119 -134 -163 -126 -123 -111 -134 -144 -118 -128 -104 -140 -143 -141 -117 -137 -117 -138 -104 -103 -116 -141 -129 -119 -126 -141 -125 -133 -103 -125 -129 -119 -101 -136 -129 -119 -112 -104 -120 -117 -122 -93 -133 -136 -115 -96 -112 -121 -124 -104 -127 -116 -127 -108 -110 -111 -113 -111 -104 -115 -114 -104 -96 -117 -116 -120 -102 -126 -107 -111 -102 -107 -118 -111 -102 -111 -118 -111 -99 -128 -114 -108 -93 -127 -111 -107 -95 -106 -118 -108 -98 -124 -110 -104 -97 -117 -113 -105 -96 -113 -119 -94 -86 -119 -116 -108 -89 -126 -106 -108 -96 -121 -119 -91 -114 -126 -102 -97 -114 -123 -96 -90 -121 -110 -94 -110 -105 -119 -100 -102 -118 -116 -99 -114 -112 -97 -103 -111 -114 -100 -101 -107 -113 -93 -96 -113 -115 -98 -96 -114 -108 -83 -121 -107 -93 -105 -109 -104 -89 -102 -112 -87 -94 -105 -93 -88 -106 -98 -88 -91 -101 -96 -89 -105 -102 -83 -94 -107 -91 -88 -100 -103 -86 -95 -103 -94 -89 -102 -85 -91 -100 -98 -81 -103 -93 -86 -103 -103 -80 -89 -102 -84 -88 -101 -98 -86 -98 -93 -83 -98 -95 -81 -89 -110 -84 -99 -98 -84 -91 -92 -99 -88 -97 -83 -81 -90 -91 -87 -93 -92 -81 -98 -92 -89 -92 -91 -83 -96 -95 -80 -99 -95 -83 -103 -98 -79 -91 -98 -94 -84 -100 -80 -83 -101 -94 -81 -99 -98 -87 -83 -107 -88 -87 -98 -97 -82 -99 -99 -84 -96 -96 -95 -88 -102 -92 -89 -99 -108 -91 -91 -109 -98 -92 -99 -104 -90 -83 -108 -101 -99 -98 -107 -101 -86 -112 -110 -96 -92 -108 -106 -96 -107 -109 -94 -83 -108 -116 -112 -88 -111 -115 -101 -104 -117 -107 -102 -105 -120 -105 -94 -113 -116 -102 -98 -116 -108 -110 -96 -94 -120 -112 -89 -121 -123 -112 -93 -110 -128 -119 -103 -107 -119 -119 -109 -115 -117 -117 -113 -118 -117 -117 -117 -106 -127 -146 -122 -108 -121 -129 -130 -118 -108 -133 -148 -137 -108 -132 -142 -137 -129 -108 -138 -114 -146 -111 -110 -137 -146 -135 -113 -135 -133 -128 -131 -140 -114 -131 -135 -145 -134 -114 -126 -146 -162 -102 -104 -159 -152 -172 -151 -183 -146 -173 -180 -179 -175 -182 -139 -173 -177 -207 -176 -180 -130 -190 -204 -160 -159 -208 -141 -116 -282 -157 -173 -160 -168 -174 -161 -211 -179 -166 -163 -188 -183 -184 -203 -157 -150 -220 -166 -166 -170 -157 -154 -166 -145 -207 -203 -158 -171 -156 -175 -180 -189 -189 -163 -165 -210 -217 -174 -165 -149 -205 -164 -189 -190 -198 -181 -172 -164 -219 -153 -204 -184 -159 -175 -161 -177 -185 -201 -189 -152 -162 -190 -220 -203 -164 -172 -140 -161 -227 -188 -186 -183 -180 -149 -207 -213 -143 -197 -158 -152 -146 -212 -171 -153 -202 -169 -162 -122 -317 -180 -203 -196 -141 -212 -216 -152 -220 -160 -171 -191 -186 -209 -226 -133 -203 -140 -197 -206 -189 -178 -196 -189 -157 -224 -224 -183 -185 -173 -170 -227 -218 -177 -188 -190 -160 -175 -215 -235 -235 -194 -176 -169 -187 -205 -213 -191 -194 -193 -181 -162 -160 -245 -261 -198 -203 -234 -148 -224 -172 -188 -209 -210 -243 -221 -138 -200 -194 -216 -198 -395 -207 -204 -160 -195 -248 -244 -231 -270 -201 -184 -163 -176 -284 -183 -202 -203 -270 -222 -158 -179 -217 -223 -306 -203 -216 -269 -146 -267 -174 -238 -302 -208 -230 -273 -180 -162 -175 -269 -236 -305 -230 -274 -297 -184 -165 -188 -308 -226 -235 -288 -195 -225 -200 -180 -211 -200 -221 -246 -293 -219 -228 -278 -199 -207 -294 -208 -236 -252 -312 -204 -280 -159 -241 -215 -270 -317 -235 -246 -327 -219 -173 -265 -198 -251 -271 -340 -277 -311 -217 -193 -293 -192 -259 -300 -252 -290 -311 -258 -208 -220 -219 -288 -324 -261 -315 -241 -324 -212 -195 -267 -231 -202 -248 -316 -271 -310 -318 -188 -181 -208 -320 -227 -345 -232 -304 -325 -236 -162 -327 -212 -293 -346 -236 -298 -228 -293 -227 -166 -180 -211 -258 -323 -222 -323 -249 -319 -236 -174 -204 -233 -330 -237 -294 -322 -298 -328 -202 -193 -242 -246 -291 -361 -283 -358 -250 -318 -215 -219 -215 -388 -347 -228 -244 -340 -224 -228 -220 -203 -200 -225 -310 -243 -334 -329 -260 -352 -231 -167 -595 -187 -299 -356 -269 -302 -204 -218 -189 -228 -213 -270 -373 -262 -354 -202 -299 -320 -270 -148 -387 -213 -229 -337 -244 -305 -359 -308 -329 -183 -368 -203 -218 -368 -210 -294 -322 -322 -405 -168 -537 -167 -227 -307 -380 -299 -320 -320 -348 -337 -293 -237 -187 -370 -265 -382 -237 -282 -444 -343 -216 -316 -344 -201 -309 -346 -364 -238 -244 -329 -239 -205 -382 -225 -352 -245 -318 -349 -315 -384 -331 -334 -374 -224 -220 -335 -250 -437 -360 -359 -227 -335 -269 -255 -269 -366 -330 -237 -244 -326 -251 -399 -251 -239 -341 -240 -351 -308 -381 -236 -412 -218 -327 -322 -292 -359 -202 -365 -250 -298 -378 -338 -365 -344 -383 -329 -336 -305 -270 -318 -343 -303 -374 -341 -390 -348 -279 -454 -282 -227 -437 -330 -389 -333 -381 -374 -243 -431 -235 -295 -259 -236 -407 -233 -391 -391 -343 -344 -402 -265 -352 -267 -255 -436 -417 -311 -426 -353 -364 -251 -436 -215 -469 -256 -307 -429 -332 -395 -404 -280 -405 -270 -361 -295 -343 -238 -346 -378 -354 -399 -367 -307 -339 -276 -290 -483 -309 -232 -385 -414 -285 -365 -394 -232 -342 -323 -311 -376 -184 -378 -292 -354 -268 -288 -365 -339 -414 -237 -437 -314 -259 -336 -368 -352 -449 -416 -233 -411 -245 -368 -420 -210 -395 -307 -396 -256 -386 -296 -404 -319 -288 -265 -358 -258 -388 -274 -394 -226 -421 -336 -354 -331 -257 -415 -338 -290 -355 -410 -364 -276 -287 -355 -331 -303 -307 -341 -249 -326 -248 -349 -321 -390 -228 -404 -209 -198 -392 -176 -378 -320 -329 -362 -277 -336 -342 -273 -411 -379 -248 -241 -316 -361 -379 -355 -339 -316 -464 -321 -253 -444 -227 -355 -391 -414 -383 -384 -254 -392 -276 -327 -324 -366 -242 -263 -527 -389 -431 -359 -297 -402 -337 -383 -384 -469 -238 -474 -458 -289 -368 -242 -334 -499 -412 -429 -259 -326 -401 -271 -507 -381 -446 -440 -275 -485 -283 -383 -402 -308 -303 -445 -253 -529 -399 -450 -450 -400 -463 -415 -304 -459 -286 -447 -375 -316 -385 -482 -449 -334 -472 -387 -412 -464 -268 -279 -473 -361 -295 -595 -362 -465 -487 -301 -448 -307 -468 -339 -324 -450 -368 -291 -437 -434 -291 -494 -412 -395 -458 -291 -403 -267 -436 -396 -274 -368 -472 -400 -445 -431 -314 -367 -409 -430 -293 -446 -322 -320 -389 -313 -401 -294 -455 -280 -510 -360 -416 -256 -474 -362 -285 -469 -340 -353 -256 -460 -379 -445 -399 -400 -417 -276 -325 -353 -430 -294 -412 -313 -426 -414 -452 -433 -260 -450 -287 -276 -442 -421 -407 -458 -438 -329 -430 -315 -403 -353 -471 -413 -241 -447 -497 -459 -377 -429 -395 -269 -364 -408 -301 -368 -458 -328 -464 -314 -411 -381 -339 -451 -349 -456 -323 -327 -483 -365 -322 -272 -487 -383 -506 -334 -415 -400 -354 -332 -301 -439 -313 -325 -317 -428 -327 -362 -381 -453 -451 -285 -483 -291 -420 -286 -242 -470 -374 -314 -416 -327 -454 -460 -362 -443 -282 -433 -347 -290 -460 -438 -399 -280 -457 -295 -367 -271 -389 -257 -414 -262 -275 -385 -396 -368 -386 -272 -345 -418 -464 -271 -442 -275 -413 -340 -490 -454 -272 -424 -336 -471 -312 -482 -367 -520 -466 -344 -341 -370 -512 -460 -311 -445 -391 -473 -414 -296 -324 -294 -434 -315 -454 -359 -558 -465 -323 -450 -310 -427 -402 -338 -474 -375 -303 -279 -470 -265 -448 -263 -419 -427 -429 -347 -432 -397 -277 -275 -371 -347 -332 -394 -302 -392 -268 -436 -241 -307 -287 -338 -319 -271 -410 -323 -381 -342 -386 -329 -404 -309 -389 -311 -273 -391 -278 -368 -326 -403 -284 -365 -338 -260 -359 -343 -302 -397 -265 -308 -438 -382 -299 -383 -300 -374 -315 -445 -270 -301 -331 -293 -467 -459 -453 -374 -470 -301 -428 -302 -518 -316 -337 -444 -364 -439 -409 -461 -392 -498 -447 -391 -342 -495 -370 -331 -333 -444 -325 -487 -368 -437 -392 -387 -424 -336 -496 -526 -305 -464 -443 -364 -469 -358 -488 -437 -355 -465 -370 -442 -451 -401 -348 -331 -496 -410 -528 -456 -345 -529 -471 -299 -534 -378 -358 -527 -462 -323 -400 -449 -396 -497 -505 -419 -554 -501 -373 -564 -409 -373 -504 -456 -383 -560 -422 -548 -447 -341 -502 -506 -344 -496 -411 -403 -445 -448 -301 -391 -469 -502 -341 -478 -281 -566 -479 -426 -446 -331 -487 -431 -371 -466 -358 -512 -477 -351 -437 -484 -438 -446 -377 -279 -341 -382 -315 -508 -450 -347 -414 -291 -401 -425 -467 -426 -262 -547 -322 -334 -469 -560 -523 -381 -668 -501 -431 -573 -493 -495 -592 -326 -400 -550 -301 -368 -447 -571 -542 -433 -562 -530 -562 -302 -618 -415 -484 -561 -354 -462 -305 -528 -531 -443 -467 -500 -341 -476 -473 -360 -559 -329 -514 -424 -321 -479 -429 -526 -450 -369 -485 -428 -321 -527 -329 -329 -373 -496 -265 -547 -463 -324 -484 -425 -325 -1139 -320 -458 -395 -306 -263 -643 -324 -341 -385 -321 -415 -380 -401 -353 -390 -327 -341 -326 -333 -428 -273 -427 -304 -384 -286 -414 -206 -555 -273 -384 -275 -391 -303 -376 -349 -498 -320 -413 -355 -412 -278 -370 -340 -304 -333 -399 -322 -424 -361 -289 -423 -410 -240 -273 -452 -300 -422 -285 -502 -424 -438 -484 -333 -499 -392 -307 -482 -346 -313 -378 -474 -302 -438 -475 -373 -381 -248 -390 -431 -434 -233 -430 -332 -438 -355 -363 -368 -416 -379 -306 -447 -356 -262 -367 -420 -380 -422 -445 -241 -496 -334 -384 -342 -412 -208 -490 -391 -438 -349 -371 -362 -397 -368 -285 -367 -279 -217 -475 -407 -248 -279 -580 -432 -290 -349 -350 -332 -240 -204 -422 -300 -464 -311 -429 -308 -405 -352 -328 -352 -314 -258 -366 -315 -421 -301 -454 -383 -257 -317 -396 -349 -281 -363 -345 -389 -276 -444 -369 -492 -351 -363 -432 -230 -258 -474 -399 -241 -382 -429 -438 -255 -456 -319 -435 -375 -325 -263 -539 -434 -242 -411 -431 -413 -254 -452 -295 -379 -323 -257 -343 -388 -269 -449 -282 -355 -304 -433 -256 -446 -201 -273 -337 -388 -467 -343 -435 -403 -327 -385 -299 -377 -293 -280 -339 -471 -402 -434 -450 -234 -512 -414 -451 -275 -384 -299 -419 -376 -439 -383 -345 -404 -452 -504 -446 -295 -428 -390 -306 -315 -469 -307 -469 -397 -318 -570 -322 -461 -325 -467 -259 -447 -375 -300 -363 -353 -355 -405 -435 -389 -363 -432 -229 -514 -284 -414 -291 -423 -324 -417 -408 -444 -271 -417 -327 -334 -412 -315 -388 -325 -480 -436 -431 -428 -340 -302 -295 -343 -331 -431 -256 -451 -358 -469 -355 -407 -427 -335 -358 -324 -282 -328 -458 -247 -606 -258 -461 -410 -438 -490 -280 -402 -361 -316 -309 -419 -424 -392 -469 -309 -463 -331 -514 -328 -396 -465 -283 -415 -340 -501 -458 -308 -448 -353 -519 -419 -340 -507 -360 -349 -341 -499 -420 -441 -507 -385 -473 -429 -276 -422 -323 -462 -315 -410 -420 -416 -408 -310 -473 -370 -457 -484 -293 -435 -293 -271 -454 -437 -337 -433 -483 -304 -441 -315 -507 -304 -386 -343 -330 -419 -459 -451 -408 -472 -404 -324 -444 -421 -309 -295 -471 -303 -499 -418 -299 -373 -326 -379 -279 -480 -362 -249 -289 -367 -263 -408 -280 -320 -431 -363 -278 -414 -275 -271 -328 -349 -255 -464 -299 -441 -267 -327 -445 -383 -388 -275 -294 -374 -286 -362 -306 -450 -280 -460 -304 -440 -403 -376 -481 -279 -251 -438 -402 -285 -425 -321 -453 -371 -457 -417 -280 -380 -263 -364 -402 -345 -273 -471 -403 -410 -403 -387 -325 -457 -330 -266 -338 -273 -284 -500 -346 -374 -341 -314 -340 -267 -232 -444 -371 -332 -352 -267 -306 -454 -328 -344 -302 -237 -261 -369 -239 -370 -248 -346 -359 -274 -330 -291 -315 -266 -338 -256 -364 -247 -256 -305 -206 -304 -214 -238 -272 -324 -278 -297 -220 -268 -352 -226 -222 -357 -218 -323 -236 -285 -255 -238 -241 -197 -219 -221 -249 -250 -193 -189 -232 -237 -205 -223 -274 -257 -183 -241 -229 -243 -167 -209 -242 -266 -201 -228 -255 -172 -220 -158 -285 -279 -188 -211 -235 -272 -186 -174 -159 -229 -254 -308 -235 -324 -227 -208 -217 -161 -275 -195 -240 -212 -213 -172 -183 -167 -240 -270 -209 -183 -198 -236 -181 -242 -184 -249 -260 -164 -222 -193 -182 -277 -164 -217 -212 -246 -253 -208 -248 -221 -212 -166 -210 -189 -273 -277 -251 -257 -213 -147 -198 -186 -258 -272 -178 -197 -191 -267 -174 -179 -195 -208 -262 -288 -203 -225 -198 -260 -167 -196 -362 -233 -188 -199 -244 -224 -200 -235 -276 -241 -206 -216 -242 -154 -232 -189 -270 -258 -217 -235 -177 -201 -241 -240 -277 -210 -184 -226 -192 -278 -153 -218 -187 -337 -182 -180 -165 -191 -172 -247 -243 -199 -188 -245 -251 -218 -139 -264 -219 -254 -190 -201 -240 -164 -264 -161 -199 -198 -264 -235 -197 -176 -184 -222 -237 -179 -193 -157 -170 -188 -145 -177 -198 -194 -266 -190 -159 -172 -194 -186 -223 -255 -176 -184 -185 -188 -222 -274 -224 -182 -231 -223 -186 -168 -180 -164 -193 -266 -247 -168 -208 -124 -260 -167 -175 -181 -215 -150 -207 -163 -216 -158 -259 -168 -142 -190 -146 -178 -228 -197 -251 -166 -180 -159 -171 -144 -176 -173 -163 -129 -191 -194 -152 -342 -228 -229 -171 -140 -141 -266 -173 -183 -234 -233 -143 -176 -161 -201 -195 -172 -160 -166 -170 -132 -143 -217 -173 -159 -178 -139 -151 -204 -168 -172 -196 -173 -162 -136 -132 -178 -178 -190 -173 -163 -123 -154 -245 -155 -200 -210 -221 -138 -173 -215 -176 -178 -176 -169 -119 -168 -246 -158 -184 -153 -183 -113 diff --git a/includes/RT/BVH.hpp b/includes/RT/BVH.hpp index 1e2f5e0..d7f77f5 100644 --- a/includes/RT/BVH.hpp +++ b/includes/RT/BVH.hpp @@ -25,9 +25,18 @@ struct AABB glm::vec3 max; AABB(glm::vec3 min, glm::vec3 max) : min(min), max(max) {} + + void grow( glm::vec3 p ) { min = glm::min( min, p ), max = glm::max( max, p ); } + + float area() + { + glm::vec3 e = max - min; + return (e.x * e.y + e.y * e.z + e.z * e.x); + } }; -struct BVHStats { +struct BVHStats +{ int min_triangles; int max_triangles; float average_triangles; @@ -44,6 +53,8 @@ class BVH void updateBounds(std::vector &primitives); void subdivide(std::vector &primitives); + float evaluateSah(std::vector &primitives, int axis, float pos); + int getSize(); int getLeaves(); BVHStats analyzeBVHLeaves(BVH* root); diff --git a/scenes/dragon.rt b/scenes/dragon.rt index afda352..0a7b643 100644 --- a/scenes/dragon.rt +++ b/scenes/dragon.rt @@ -24,7 +24,7 @@ pl 0 -2 0 0 1 0 2 // floor qu -1 1.999 -1 2 0 0 0 0 2 6 -OBJ obj/Dragon_80K.obj +OBJ obj/Dragon_800K.obj # po -1.99 -0.5 -0.5 0 1 0 0 0 1 1 4 # po -0.5 -0.5 -1.99 0 1 0 1 0 0 0 4 diff --git a/shaders/compute.glsl b/shaders/compute.glsl index 983565a..894dbfd 100644 --- a/shaders/compute.glsl +++ b/shaders/compute.glsl @@ -85,20 +85,22 @@ layout(std430, binding = 2) buffer TriangleBuffer GPUTriangle triangles[]; }; -layout(std430, binding = 3) buffer MaterialBuffer +layout(std430, binding = 3) buffer BvhBuffer +{ + GPUBvh bvh[]; +}; + +layout(std430, binding = 4) buffer MaterialBuffer { GPUMaterial materials[]; }; -layout(std430, binding = 4) buffer LightsBuffer +layout(std430, binding = 5) buffer LightsBuffer { int lightsIndex[]; }; -layout(std430, binding = 5) buffer BvhBuffer -{ - GPUBvh bvh[]; -}; + layout(std140, binding = 0) uniform CameraData diff --git a/srcs/RT.cpp b/srcs/RT.cpp index 1dfb72b..47301b1 100644 --- a/srcs/RT.cpp +++ b/srcs/RT.cpp @@ -20,52 +20,53 @@ int main(int argc, char **argv) return (1); Window window(&scene, WIDTH, HEIGHT, "RT_GPU", 0); - // Shader shader("shaders/vertex.vert", "shaders/frag.frag", "shaders/compute.glsl"); - Shader shader("shaders/vertex.vert", "shaders/frag.frag", "shaders/debug.glsl"); + Shader shader("shaders/vertex.vert", "shaders/frag.frag", "shaders/compute.glsl"); + // Shader shader("shaders/vertex.vert", "shaders/frag.frag", "shaders/debug.glsl"); GLint max_gpu_size; glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &max_gpu_size); const std::vector &object_data = scene.getObjectData(); const std::vector &triangle_data = scene.getTriangleData(); - + const std::vector &bvh_data = scene.getBVH(); const std::vector &material_data = scene.getMaterialData(); std::cout << "Sending " << object_data.size() << " objects for " << \ object_data.size() * sizeof(GPUObject) + \ triangle_data.size() * sizeof(GPUTriangle) + \ + bvh_data.size() * sizeof(GPUBvh) + \ material_data.size() * sizeof(GPUMaterial) \ << " / " << max_gpu_size << " bytes" << std::endl; GLuint objectSSBO; glGenBuffers(1, &objectSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, objectSSBO); - glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GPUObject) * object_data.size(), nullptr, GL_STATIC_DRAW); + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GPUObject) * object_data.size(), object_data.data(), GL_STATIC_DRAW); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, objectSSBO); GLuint trianglesSSBO; glGenBuffers(1, &trianglesSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, trianglesSSBO); - glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GPUTriangle) * triangle_data.size(), nullptr, GL_STATIC_DRAW); + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GPUTriangle) * triangle_data.size(), triangle_data.data(), GL_STATIC_DRAW); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, trianglesSSBO); + GLuint bvhSSBO; + glGenBuffers(1, &bvhSSBO); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, bvhSSBO); + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GPUBvh) * bvh_data.size(), bvh_data.data(), GL_STATIC_DRAW); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, bvhSSBO); + GLuint materialSSBO; glGenBuffers(1, &materialSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, materialSSBO); glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(GPUMaterial) * material_data.size(), nullptr, GL_STATIC_DRAW); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, materialSSBO); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, materialSSBO); GLuint lightSSBO; glGenBuffers(1, &lightSSBO); glBindBuffer(GL_SHADER_STORAGE_BUFFER, lightSSBO); glBufferData(GL_SHADER_STORAGE_BUFFER, scene.getGPULights().size() * sizeof(int), nullptr, GL_STATIC_DRAW); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, lightSSBO); - - GLuint bvhSSBO; - glGenBuffers(1, &bvhSSBO); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, bvhSSBO); - glBufferData(GL_SHADER_STORAGE_BUFFER, scene.getBVH().size() * sizeof(GPUBvh), nullptr, GL_STATIC_DRAW); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 5, bvhSSBO); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 5, lightSSBO); GLuint cameraUBO; @@ -99,13 +100,7 @@ int main(int argc, char **argv) { glUseProgram(shader.getProgramCompute()); - - glBindBuffer(GL_SHADER_STORAGE_BUFFER, objectSSBO); - glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, object_data.size() * sizeof(GPUObject), object_data.data()); - - glBindBuffer(GL_SHADER_STORAGE_BUFFER, trianglesSSBO); - glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, triangle_data.size() * sizeof(GPUTriangle), triangle_data.data()); - + glBindBuffer(GL_SHADER_STORAGE_BUFFER, materialSSBO); glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, material_data.size() * sizeof(GPUMaterial), material_data.data()); @@ -113,16 +108,11 @@ int main(int argc, char **argv) std::vector gpu_lights_array(gpu_lights.begin(), gpu_lights.end()); glBindBuffer(GL_SHADER_STORAGE_BUFFER, lightSSBO); glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, gpu_lights_array.size() * sizeof(int), gpu_lights_array.data()); - - std::vector gpu_bvh = scene.getBVH(); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, bvhSSBO); - glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, gpu_bvh.size() * sizeof(GPUBvh), gpu_bvh.data()); - Camera *camera = scene.getCamera(); // performance profiling - if (true) + if (false) { float time = (float)(glfwGetTime()) ; @@ -161,7 +151,7 @@ int main(int argc, char **argv) shader.set_int("u_frameCount", window.getFrameCount()); shader.set_int("u_objectsNum", object_data.size()); - shader.set_int("u_bvhNum", gpu_bvh.size()); + shader.set_int("u_bvhNum", scene.getBVH().size()); shader.set_int("u_lightsNum", gpu_lights.size()); shader.set_int("u_pixelisation", window.getPixelisation()); shader.set_float("u_time", (float)(glfwGetTime())); diff --git a/srcs/class/BVH.cpp b/srcs/class/BVH.cpp index 4650fe1..c7d0459 100644 --- a/srcs/class/BVH.cpp +++ b/srcs/class/BVH.cpp @@ -44,26 +44,85 @@ void BVH::updateBounds(std::vector &primitives) } } + +float BVH::evaluateSah(std::vector &primitives, int axis, float pos) +{ + AABB left_box(glm::vec3(1e30f), glm::vec3(-1e30f)); + AABB right_box(glm::vec3(1e30f), glm::vec3(-1e30f)); + + int left_count = 0; + int right_count = 0; + + for (unsigned int i = 0; i < _primitive_count; i++) + { + GPUTriangle triangle = primitives[_first_primitive + i]; + glm::vec3 centroid = (triangle.position + triangle.vertex1 + triangle.vertex2) / 3.0f; + + if (centroid[axis] < pos) + { + left_count++; + left_box.grow( triangle.position ); + left_box.grow( triangle.vertex1 ); + left_box.grow( triangle.vertex2 ); + } + else + { + right_count++; + right_box.grow( triangle.position ); + right_box.grow( triangle.vertex1 ); + right_box.grow( triangle.vertex2 ); + } + } + float cost = left_count * left_box.area() + right_count * right_box.area(); + return (cost > 0 ? cost : 1e30f); +} + + + void BVH::subdivide(std::vector &primitives) { - if (_primitive_count <= 100) + if (_primitive_count <= 4) return ; glm::vec3 extent = _aabb.max - _aabb.min; - int axis = 0; - if (extent.y > extent.x) axis = 1; - if (extent.z > extent[axis]) axis = 2; + const int num_test_per_axis = 5; - float split_pos = _aabb.min[axis] + extent[axis] * 0.5f; + int best_axis = 0; + float best_pos = 0; + float best_cost = 1e30f; + + for (int axis = 0; axis < 3; axis++) + { + float start_pos = _aabb.min[axis]; + float end_pos = _aabb.max[axis]; + + for (int i = 0; i < num_test_per_axis; i++) + { + float split_t = (i + 1) / (num_test_per_axis + 1.0f); + float candidate_pos = start_pos + (end_pos - start_pos) * split_t; + + float cost = evaluateSah(primitives, axis, candidate_pos); + + if (cost < best_cost) + { + best_pos = candidate_pos; + best_axis = axis; + best_cost = cost; + } + } + } + + int axis = best_axis; + float split_pos = best_pos; int i = _first_primitive; int j = _first_primitive + _primitive_count - 1; while (i <= j) { - glm::vec3 centroid = primitives[i].position + primitives[i].vertex1 + primitives[i].vertex2; - centroid /= 3.0f; + GPUTriangle triangle = primitives[i]; + glm::vec3 centroid = (triangle.position + triangle.vertex1 + triangle.vertex2) / 3.0f; if (centroid[axis] < split_pos) i++;