Merge branch 'develop' into feature/globebrowsing

This commit is contained in:
Kalle Bladin
2016-06-08 12:32:31 -04:00
26 changed files with 220 additions and 84 deletions
+18 -14
View File
@@ -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),
+63 -11
View File
@@ -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");
+16
View File
@@ -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,
+17
View File
@@ -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):