| 477 | } |
| 478 | |
| 479 | pbr_renderer::pbr_renderer(const renderer_settings settings) : settings(settings) |
| 480 | { |
| 481 | assert(settings.renderSize.x > 0 && settings.renderSize.y > 0); |
| 482 | assert(settings.cameraCount >= 1); |
| 483 | |
| 484 | post_quad = make_fullscreen_quad(); |
| 485 | cubemap_box = make_cube_mesh(); |
| 486 | |
| 487 | eyeFramebuffers.resize(settings.cameraCount); |
| 488 | eyeTextures.resize(settings.cameraCount); |
| 489 | eyeDepthTextures.resize(settings.cameraCount); |
| 490 | |
| 491 | // Generate multisample render buffers for color and depth, attach to multi-sampled framebuffer target |
| 492 | glNamedRenderbufferStorageMultisample(multisampleRenderbuffers[0], settings.msaaSamples, GL_RGBA16F, settings.renderSize.x, settings.renderSize.y); |
| 493 | glNamedFramebufferRenderbuffer(multisampleFramebuffer, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, multisampleRenderbuffers[0]); |
| 494 | glNamedRenderbufferStorageMultisample(multisampleRenderbuffers[1], settings.msaaSamples, GL_DEPTH24_STENCIL8, settings.renderSize.x, settings.renderSize.y); |
| 495 | glNamedFramebufferRenderbuffer(multisampleFramebuffer, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, multisampleRenderbuffers[1]); |
| 496 | |
| 497 | multisampleFramebuffer.check_complete(); |
| 498 | |
| 499 | // Generate textures and framebuffers for |settings.cameraCount| |
| 500 | for (uint32_t camIdx = 0; camIdx < settings.cameraCount; ++camIdx) |
| 501 | { |
| 502 | // Depth |
| 503 | eyeDepthTextures[camIdx].setup(settings.renderSize.x, settings.renderSize.y, GL_DEPTH_COMPONENT32, GL_DEPTH_COMPONENT, GL_FLOAT, nullptr); |
| 504 | |
| 505 | // Color (16-bit float for HDR precision, eliminates banding on smooth gradients) |
| 506 | eyeTextures[camIdx].setup(settings.renderSize.x, settings.renderSize.y, GL_RGBA16F, GL_RGBA, GL_FLOAT, nullptr, false); |
| 507 | glTextureParameteri(eyeTextures[camIdx], GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 508 | glTextureParameteri(eyeTextures[camIdx], GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| 509 | glTextureParameteri(eyeTextures[camIdx], GL_TEXTURE_MAX_LEVEL, 0); |
| 510 | |
| 511 | // Attachments |
| 512 | glNamedFramebufferTexture(eyeFramebuffers[camIdx], GL_COLOR_ATTACHMENT0, eyeTextures[camIdx], 0); |
| 513 | glNamedFramebufferTexture(eyeFramebuffers[camIdx], GL_DEPTH_ATTACHMENT, eyeDepthTextures[camIdx], 0); |
| 514 | |
| 515 | eyeFramebuffers[camIdx].check_complete(); |
| 516 | } |
| 517 | |
| 518 | if (settings.tonemapEnabled) |
| 519 | { |
| 520 | postFramebuffers.resize(settings.cameraCount); |
| 521 | postTextures.resize(settings.cameraCount); |
| 522 | |
| 523 | for (uint32_t camIdx = 0; camIdx < settings.cameraCount; ++camIdx) |
| 524 | { |
| 525 | postTextures[camIdx].setup(settings.renderSize.x, settings.renderSize.y, GL_RGBA, GL_RGBA, GL_FLOAT, nullptr, false); |
| 526 | glTextureParameteri(postTextures[camIdx], GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 527 | glTextureParameteri(postTextures[camIdx], GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| 528 | glTextureParameteri(postTextures[camIdx], GL_TEXTURE_MAX_LEVEL, 0); |
| 529 | glNamedFramebufferTexture(postFramebuffers[camIdx], GL_COLOR_ATTACHMENT0, postTextures[camIdx], 0); |
| 530 | postFramebuffers[camIdx].check_complete(); |
| 531 | } |
| 532 | } |
| 533 | |
| 534 | gl_check_error(__FILE__, __LINE__); |
| 535 | |
| 536 | // Only create shadow resources if the user has requested them. |
nothing calls this directly
no test coverage detected