mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-05-25 13:58:55 -05:00
Merge branch 'develop' into feature/globebrowsing
This commit is contained in:
@@ -109,15 +109,7 @@ void ABufferRenderer::initialize() {
|
||||
GLint defaultFbo;
|
||||
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFbo);
|
||||
|
||||
|
||||
_nAaSamples = OsEng.windowWrapper().currentNumberOfAaSamples();
|
||||
if (_nAaSamples == 0) {
|
||||
_nAaSamples = 1;
|
||||
}
|
||||
if (_nAaSamples > 8) {
|
||||
LERROR("ABuffer renderer does not support more than 8 MSAA samples.");
|
||||
_nAaSamples = 8;
|
||||
}
|
||||
|
||||
|
||||
updateResolution();
|
||||
updateRendererData();
|
||||
@@ -335,9 +327,10 @@ void ABufferRenderer::preRaycast(ghoul::opengl::ProgramObject& program) {
|
||||
|
||||
glm::vec3 localCameraPosition;
|
||||
bool cameraIsInside = raycastData.first->cameraIsInside(*_renderData, localCameraPosition);
|
||||
program.setUniform("insideRaycaster" + std::to_string(raycastData.second.id), cameraIsInside);
|
||||
int uniformIndex = raycastData.second.id + 1; // uniforms are indexed from 1 (not from 0)
|
||||
program.setUniform("insideRaycaster" + std::to_string(uniformIndex), cameraIsInside);
|
||||
if (cameraIsInside) {
|
||||
program.setUniform("cameraPosInRaycaster" + std::to_string(raycastData.second.id), localCameraPosition);
|
||||
program.setUniform("cameraPosInRaycaster" + std::to_string(uniformIndex), localCameraPosition);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -367,6 +360,18 @@ void ABufferRenderer::setResolution(glm::ivec2 res) {
|
||||
}
|
||||
}
|
||||
|
||||
void ABufferRenderer::setNAaSamples(int nAaSamples) {
|
||||
_nAaSamples = nAaSamples;
|
||||
if (_nAaSamples == 0) {
|
||||
_nAaSamples = 1;
|
||||
}
|
||||
if (_nAaSamples > 8) {
|
||||
LERROR("Framebuffer renderer does not support more than 8 MSAA samples.");
|
||||
_nAaSamples = 8;
|
||||
}
|
||||
_dirtyResolution = true;
|
||||
}
|
||||
|
||||
void ABufferRenderer::clear() {
|
||||
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, _anchorPointerTextureInitializer);
|
||||
glBindTexture(GL_TEXTURE_2D, _anchorPointerTexture);
|
||||
@@ -406,12 +411,11 @@ void ABufferRenderer::updateResolution() {
|
||||
|
||||
glBindImageTexture(1, _fragmentTexture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32UI);
|
||||
|
||||
int nSamples = OsEng.windowWrapper().currentNumberOfAaSamples();
|
||||
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainColorTexture);
|
||||
|
||||
glTexImage2DMultisample(
|
||||
GL_TEXTURE_2D_MULTISAMPLE,
|
||||
nSamples,
|
||||
_nAaSamples,
|
||||
GL_RGBA,
|
||||
GLsizei(_resolution.x),
|
||||
GLsizei(_resolution.y),
|
||||
@@ -420,7 +424,7 @@ void ABufferRenderer::updateResolution() {
|
||||
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainDepthTexture);
|
||||
glTexImage2DMultisample(
|
||||
GL_TEXTURE_2D_MULTISAMPLE,
|
||||
nSamples,
|
||||
_nAaSamples,
|
||||
GL_DEPTH_COMPONENT32F,
|
||||
GLsizei(_resolution.x),
|
||||
GLsizei(_resolution.y),
|
||||
|
||||
@@ -125,14 +125,7 @@ void FramebufferRenderer::initialize() {
|
||||
|
||||
OsEng.renderEngine().raycasterManager().addListener(*this);
|
||||
|
||||
_nAaSamples = OsEng.windowWrapper().currentNumberOfAaSamples();
|
||||
if (_nAaSamples == 0) {
|
||||
_nAaSamples = 1;
|
||||
}
|
||||
if (_nAaSamples > 8) {
|
||||
LERROR("Framebuffer renderer does not support more than 8 MSAA samples.");
|
||||
_nAaSamples = 8;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void FramebufferRenderer::deinitialize() {
|
||||
@@ -198,12 +191,23 @@ void FramebufferRenderer::update() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto &program : _insideRaycastPrograms) {
|
||||
if (program.second->isDirty()) {
|
||||
try {
|
||||
program.second->rebuildFromFile();
|
||||
}
|
||||
catch (ghoul::RuntimeError e) {
|
||||
LERROR(e.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FramebufferRenderer::updateResolution() {
|
||||
int nSamples = _nAaSamples;
|
||||
PerfMeasure("FramebufferRenderer::updateResolution");
|
||||
|
||||
int nSamples = OsEng.windowWrapper().currentNumberOfAaSamples();
|
||||
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, _mainColorTexture);
|
||||
|
||||
glTexImage2DMultisample(
|
||||
@@ -263,6 +267,7 @@ void FramebufferRenderer::updateRaycastData() {
|
||||
_raycastData.clear();
|
||||
_exitPrograms.clear();
|
||||
_raycastPrograms.clear();
|
||||
_insideRaycastPrograms.clear();
|
||||
|
||||
const std::vector<VolumeRaycaster*>& raycasters = OsEng.renderEngine().raycasterManager().raycasters();
|
||||
int nextId = 0;
|
||||
@@ -299,6 +304,15 @@ void FramebufferRenderer::updateRaycastData() {
|
||||
} catch (ghoul::RuntimeError e) {
|
||||
LERROR(e.message);
|
||||
}
|
||||
try {
|
||||
_insideRaycastPrograms[raycaster] = ghoul::opengl::ProgramObject::Build(
|
||||
"Volume " + std::to_string(data.id) + " inside raycast",
|
||||
"${SHADERS}/framebuffer/resolveframebuffer.vert",
|
||||
RaycastFragmentShaderPath, dict);
|
||||
}
|
||||
catch (ghoul::RuntimeError e) {
|
||||
LERROR(e.message);
|
||||
}
|
||||
}
|
||||
_dirtyRaycastData = false;
|
||||
}
|
||||
@@ -343,9 +357,25 @@ void FramebufferRenderer::render(float blackoutFactor, bool doPerformanceMeasure
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, _mainFramebuffer);
|
||||
|
||||
ghoul::opengl::ProgramObject* raycastProgram = _raycastPrograms[raycaster].get();
|
||||
|
||||
ghoul::opengl::ProgramObject* insideRaycastProgram = _raycastPrograms[raycaster].get();
|
||||
|
||||
glm::vec3 cameraPosition;
|
||||
bool cameraIsInside = raycaster->cameraIsInside(raycasterTask.renderData, cameraPosition);
|
||||
ghoul::opengl::ProgramObject* raycastProgram = nullptr;
|
||||
|
||||
if (cameraIsInside) {
|
||||
raycastProgram = _insideRaycastPrograms[raycaster].get();
|
||||
} else {
|
||||
raycastProgram = _raycastPrograms[raycaster].get();
|
||||
}
|
||||
|
||||
if (raycastProgram) {
|
||||
raycastProgram->activate();
|
||||
|
||||
raycastProgram->setUniform("insideRaycaster", cameraIsInside);
|
||||
raycastProgram->setUniform("cameraPosInRaycaster", cameraPosition);
|
||||
|
||||
raycaster->preRaycast(_raycastData[raycaster], *raycastProgram);
|
||||
|
||||
ghoul::opengl::TextureUnit exitColorTextureUnit;
|
||||
@@ -365,12 +395,21 @@ void FramebufferRenderer::render(float blackoutFactor, bool doPerformanceMeasure
|
||||
|
||||
raycastProgram->setUniform("nAaSamples", _nAaSamples);
|
||||
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDepthMask(false);
|
||||
raycaster->renderEntryPoints(raycasterTask.renderData, *raycastProgram);
|
||||
if (cameraIsInside) {
|
||||
glBindVertexArray(_screenQuad);
|
||||
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||
glBindVertexArray(0);
|
||||
} else {
|
||||
raycaster->renderEntryPoints(raycasterTask.renderData, *raycastProgram);
|
||||
}
|
||||
glDepthMask(true);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
|
||||
|
||||
raycaster->postRaycast(_raycastData[raycaster], *raycastProgram);
|
||||
raycastProgram->deactivate();
|
||||
} else {
|
||||
@@ -390,6 +429,7 @@ void FramebufferRenderer::render(float blackoutFactor, bool doPerformanceMeasure
|
||||
_resolveProgram->setUniform("nAaSamples", _nAaSamples);
|
||||
glBindVertexArray(_screenQuad);
|
||||
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||
glBindVertexArray(0);
|
||||
|
||||
_resolveProgram->deactivate();
|
||||
}
|
||||
@@ -407,6 +447,18 @@ void FramebufferRenderer::setResolution(glm::ivec2 res) {
|
||||
_dirtyResolution = true;
|
||||
}
|
||||
|
||||
void FramebufferRenderer::setNAaSamples(int nAaSamples) {
|
||||
_nAaSamples = nAaSamples;
|
||||
if (_nAaSamples == 0) {
|
||||
_nAaSamples = 1;
|
||||
}
|
||||
if (_nAaSamples > 8) {
|
||||
LERROR("Framebuffer renderer does not support more than 8 MSAA samples.");
|
||||
_nAaSamples = 8;
|
||||
}
|
||||
_dirtyResolution = true;
|
||||
}
|
||||
|
||||
void FramebufferRenderer::updateRendererData() {
|
||||
PerfMeasure("FramebufferRenderer::updateRendererData");
|
||||
|
||||
|
||||
@@ -185,6 +185,7 @@ bool RenderEngine::initialize() {
|
||||
}
|
||||
|
||||
_raycasterManager = new RaycasterManager();
|
||||
_nAaSamples = OsEng.windowWrapper().currentNumberOfAaSamples();
|
||||
|
||||
LINFO("Seting renderer from string: " << renderingMethod);
|
||||
setRendererFromString(renderingMethod);
|
||||
@@ -636,11 +637,20 @@ void RenderEngine::setRenderer(std::unique_ptr<Renderer> renderer) {
|
||||
|
||||
_renderer = std::move(renderer);
|
||||
_renderer->setResolution(res);
|
||||
_renderer->setNAaSamples(_nAaSamples);
|
||||
_renderer->initialize();
|
||||
_renderer->setCamera(_mainCamera);
|
||||
_renderer->setScene(_sceneGraph);
|
||||
}
|
||||
|
||||
|
||||
void RenderEngine::setNAaSamples(int nAaSamples) {
|
||||
_nAaSamples = nAaSamples;
|
||||
if (_renderer) {
|
||||
_renderer->setNAaSamples(_nAaSamples);
|
||||
}
|
||||
}
|
||||
|
||||
scripting::ScriptEngine::LuaLibrary RenderEngine::luaLibrary() {
|
||||
return {
|
||||
"",
|
||||
@@ -657,6 +667,12 @@ scripting::ScriptEngine::LuaLibrary RenderEngine::luaLibrary() {
|
||||
"string",
|
||||
"Sets the renderer (ABuffer or FrameBuffer)"
|
||||
},
|
||||
{
|
||||
"setNAaSamples",
|
||||
&luascriptfunctions::setNAaSamples,
|
||||
"int",
|
||||
"Sets the number of anti-aliasing (msaa) samples"
|
||||
},
|
||||
{
|
||||
"showRenderInformation",
|
||||
&luascriptfunctions::showRenderInformation,
|
||||
|
||||
@@ -57,6 +57,23 @@ int setRenderer(lua_State* L) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* \ingroup LuaScripts
|
||||
* setNAaSamples(int):
|
||||
* set the number of anti-aliasing samples (msaa)
|
||||
*/
|
||||
int setNAaSamples(lua_State* L) {
|
||||
int nArguments = lua_gettop(L);
|
||||
if (nArguments != 1)
|
||||
return luaL_error(L, "Expected %i arguments, got %i", 1, nArguments);
|
||||
|
||||
double t = luaL_checknumber(L, -1);
|
||||
|
||||
OsEng.renderEngine().setNAaSamples(static_cast<int>(t));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* \ingroup LuaScripts
|
||||
* visualizeABuffer(bool):
|
||||
|
||||
Reference in New Issue
Block a user