refactor abuffer and add msaa support. volumes temporarily disabled.

This commit is contained in:
Emil Axelsson
2016-02-02 11:30:27 +01:00
parent 4f7ab5321f
commit d4ff8119d1
79 changed files with 2354 additions and 3106 deletions
@@ -23,6 +23,8 @@
****************************************************************************************/
// openspace
#include <openspace/engine/openspaceengine.h>
#include <openspace/rendering/renderengine.h>
#include <modules/base/rendering/renderableconstellationbounds.h>
#include <openspace/util/spicemanager.h>
#include <openspace/util/updatestructures.h>
@@ -90,9 +92,11 @@ RenderableConstellationBounds::~RenderableConstellationBounds() {
}
bool RenderableConstellationBounds::initialize() {
_program = ghoul::opengl::ProgramObject::Build("ConstellationBounds",
"${MODULE_BASE}/shaders/constellationbounds_vs.glsl",
"${MODULE_BASE}/shaders/constellationbounds_fs.glsl");
RenderEngine* renderEngine = OsEng.renderEngine();
_program = renderEngine->buildRenderProgram("ConstellationBounds",
"${MODULE_BASE}/shaders/constellationbounds_vs.glsl",
"${MODULE_BASE}/shaders/constellationbounds_fs.glsl");
if (!_program)
return false;
@@ -138,8 +142,11 @@ bool RenderableConstellationBounds::deinitialize() {
glDeleteVertexArrays(1, &_vao);
_vao = 0;
delete _program;
_program = nullptr;
RenderEngine* renderEngine = OsEng.renderEngine();
if (_program) {
renderEngine->removeRenderProgram(_program);
_program = nullptr;
}
return true;
}
@@ -176,9 +183,6 @@ void RenderableConstellationBounds::render(const RenderData& data) {
}
void RenderableConstellationBounds::update(const UpdateData& data) {
if (_program->isDirty())
_program->rebuildFromFile();
SpiceManager::ref().getPositionTransformMatrix(
_originReferenceFrame,
"GALACTIC",
+11 -3
View File
@@ -26,6 +26,7 @@
// ie after I see model on screen)
// open space includes
#include <openspace/rendering/renderengine.h>
#include <modules/base/rendering/renderablemodel.h>
#include <openspace/util/constants.h>
#include <modules/base/rendering/modelgeometry.h>
@@ -126,9 +127,12 @@ bool RenderableModel::initialize() {
bool completeSuccess = true;
if (_programObject == nullptr) {
// NH shader
_programObject = ghoul::opengl::ProgramObject::Build("ModelProgram",
RenderEngine* renderEngine = OsEng.renderEngine();
_programObject = renderEngine->buildRenderProgram("ModelProgram",
"${MODULE_BASE}/shaders/model_vs.glsl",
"${MODULE_BASE}/shaders/model_fs.glsl");
if (!_programObject)
return false;
}
@@ -152,8 +156,12 @@ bool RenderableModel::deinitialize() {
delete _texture;
_texture = nullptr;
delete _programObject;
_programObject = nullptr;
RenderEngine* renderEngine = OsEng.renderEngine();
if (_programObject) {
renderEngine->removeRenderProgram(_programObject);
_programObject = nullptr;
}
return true;
}
+12 -6
View File
@@ -31,6 +31,7 @@
#include <ghoul/opengl/programobject.h>
#include <ghoul/misc/highresclock.h>
#include <openspace/engine/openspaceengine.h>
#include <openspace/rendering/renderengine.h>
#include <openspace/interaction/interactionhandler.h>
#include <fstream>
@@ -99,10 +100,12 @@ bool RenderablePath::initialize() {
}
bool completeSuccess = true;
_programObject = ghoul::opengl::ProgramObject::Build("PathProgram",
"${MODULE_BASE}/shaders/path_vs.glsl",
"${MODULE_BASE}/shaders/path_fs.glsl"
);
RenderEngine* renderEngine = OsEng.renderEngine();
_programObject = renderEngine->buildRenderProgram("PathProgram",
"${MODULE_BASE}/shaders/path_vs.glsl",
"${MODULE_BASE}/shaders/path_fs.glsl");
if (!_programObject)
return false;
@@ -124,8 +127,11 @@ bool RenderablePath::deinitialize() {
glDeleteBuffers(1, &_vBufferID);
_vBufferID = 0;
delete _programObject;
_programObject = nullptr;
RenderEngine* renderEngine = OsEng.renderEngine();
if (_programObject) {
renderEngine->removeRenderProgram(_programObject);
_programObject = nullptr;
}
return true;
}
+10 -4
View File
@@ -144,9 +144,12 @@ bool RenderablePlane::initialize() {
if (_shader == nullptr) {
// Plane Program
_shader = ghoul::opengl::ProgramObject::Build("PlaneProgram",
RenderEngine* renderEngine = OsEng.renderEngine();
_shader = renderEngine->buildRenderProgram("PlaneProgram",
"${MODULE_BASE}/shaders/plane_vs.glsl",
"${MODULE_BASE}/shaders/plane_fs.glsl");
"${MODULE_BASE}/shaders/plane_fs.glsl"
);
if (!_shader)
return false;
}
@@ -173,8 +176,11 @@ bool RenderablePlane::deinitialize() {
delete _textureFile;
_textureFile = nullptr;
delete _shader;
_shader = nullptr;
RenderEngine* renderEngine = OsEng.renderEngine();
if (_shader) {
renderEngine->removeRenderProgram(_shader);
_shader = nullptr;
}
return true;
}
+31 -4
View File
@@ -27,6 +27,7 @@
#include <openspace/engine/configurationmanager.h>
#include <openspace/engine/openspaceengine.h>
#include <openspace/rendering/renderengine.h>
#include <modules/base/rendering/planetgeometry.h>
#include <openspace/util/constants.h>
#include <openspace/util/time.h>
@@ -122,10 +123,26 @@ RenderablePlanet::~RenderablePlanet() {
}
bool RenderablePlanet::initialize() {
if (_programObject == nullptr && _hasNightTexture)
OsEng.ref().configurationManager()->getValue("nightTextureProgram", _programObject);
else if (_programObject == nullptr)
OsEng.ref().configurationManager()->getValue("pscShader", _programObject);
RenderEngine* renderEngine = OsEng.renderEngine();
if (_programObject == nullptr && _hasNightTexture) {
// Night texture program
_programObject = renderEngine->buildRenderProgram(
"nightTextureProgram",
"${SHADERS}/nighttexture_vs.glsl",
"${SHADERS}/nighttexture_fs.glsl");
if (!_programObject) return false;
}
else if (_programObject == nullptr) {
// pscstandard
_programObject = renderEngine->buildRenderProgram(
"pscstandard",
"${SHADERS}/pscstandard_vs.glsl",
"${SHADERS}/pscstandard_fs.glsl");
if (!_programObject) return false;
}
_programObject->setIgnoreSubroutineUniformLocationError(true);
loadTexture();
_geometry->initialize(this);
@@ -143,6 +160,12 @@ bool RenderablePlanet::deinitialize() {
if (_nightTexture)
delete _nightTexture;
RenderEngine* renderEngine = OsEng.renderEngine();
if (_programObject) {
renderEngine->removeRenderProgram(_programObject);
_programObject = nullptr;
}
_geometry = nullptr;
_texture = nullptr;
_nightTexture = nullptr;
@@ -206,6 +229,10 @@ void RenderablePlanet::render(const RenderData& data)
_nightTexture->bind();
_programObject->setUniform("nightTex", nightUnit);
}
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
// render
_geometry->render();
+12 -4
View File
@@ -22,10 +22,12 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
#include <modules/base/rendering/renderablesphere.h>
#include <openspace/util/constants.h>
#include <openspace/engine/openspaceengine.h>
#include <openspace/rendering/renderengine.h>
#include <ghoul/io/texture/texturereader.h>
#include <ghoul/opengl/textureunit.h>
#include <ghoul/filesystem/filesystem.h>
@@ -116,7 +118,8 @@ bool RenderableSphere::initialize() {
_sphere->initialize();
// pscstandard
_shader = ghoul::opengl::ProgramObject::Build("Sphere",
RenderEngine* renderEngine = OsEng.renderEngine();
_shader = renderEngine->buildRenderProgram("Sphere",
"${MODULES}/base/shaders/sphere_vs.glsl",
"${MODULES}/base/shaders/sphere_fs.glsl");
if (!_shader)
@@ -134,8 +137,11 @@ bool RenderableSphere::deinitialize() {
delete _texture;
_texture = nullptr;
delete _shader;
_shader = nullptr;
RenderEngine* renderEngine = OsEng.renderEngine();
if (_shader) {
renderEngine->removeRenderProgram(_shader);
_shader = nullptr;
}
return true;
}
@@ -154,7 +160,6 @@ void RenderableSphere::render(const RenderData& data) {
_shader->setUniform("ViewProjection", data.camera.viewProjectionMatrix());
_shader->setUniform("ModelTransform", transform);
setPscUniforms(_shader, &data.camera, data.position);
_shader->setUniform("alpha", _transparency);
ghoul::opengl::TextureUnit unit;
@@ -162,6 +167,9 @@ void RenderableSphere::render(const RenderData& data) {
_texture->bind();
_shader->setUniform("texture1", unit);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
_sphere->render();
_shader->setIgnoreUniformLocationError(false);
+15 -18
View File
@@ -25,6 +25,8 @@
#include <modules/base/rendering/renderablestars.h>
#include <openspace/util/updatestructures.h>
#include <openspace/engine/openspaceengine.h>
#include <openspace/rendering/renderengine.h>
#include <ghoul/filesystem/filesystem>
#include <ghoul/misc/templatefactory.h>
@@ -90,8 +92,8 @@ RenderableStars::RenderableStars(const ghoul::Dictionary& dictionary)
, _colorTextureIsDirty(true)
, _colorOption("colorOption", "Color Option")
, _dataIsDirty(true)
, _scaleFactor("scaleFactor", "Scale Factor", 5.f, 0.f, 10.f)
, _minBillboardSize("minBillboardSize", "Min Billboard Size", 15.f, 1.f, 100.f)
, _scaleFactor("scaleFactor", "Scale Factor", 1.f, 0.f, 10.f)
, _minBillboardSize("minBillboardSize", "Min Billboard Size", 1.f, 1.f, 100.f)
, _program(nullptr)
, _speckFile("")
, _nValuesPerStar(0)
@@ -147,10 +149,12 @@ bool RenderableStars::isReady() const {
bool RenderableStars::initialize() {
bool completeSuccess = true;
_program = ghoul::opengl::ProgramObject::Build("Star",
RenderEngine* renderEngine = OsEng.renderEngine();
_program = renderEngine->buildRenderProgram("Star",
"${MODULE_BASE}/shaders/star_vs.glsl",
"${MODULE_BASE}/shaders/star_fs.glsl",
"${MODULE_BASE}/shaders/star_ge.glsl");
if (!_program)
return false;
completeSuccess &= loadData();
@@ -168,17 +172,16 @@ bool RenderableStars::deinitialize() {
delete _pointSpreadFunctionTexture;
_pointSpreadFunctionTexture = nullptr;
if(_program)
delete _program;
_program = nullptr;
return true;
RenderEngine* renderEngine = OsEng.renderEngine();
if (_program) {
renderEngine->removeRenderProgram(_program);
_program = nullptr;
}
return true;
}
void RenderableStars::render(const RenderData& data) {
//glEnable(GL_BLEND);
//glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
glDisable(GL_DEPTH_TEST);
glDepthMask(false);
_program->activate();
// @Check overwriting the scaling from the camera; error as parsec->meter conversion
@@ -223,16 +226,10 @@ void RenderableStars::render(const RenderData& data) {
_program->setIgnoreUniformLocationError(false);
_program->deactivate();
//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_DEPTH_TEST);
glDepthMask(true);
}
void RenderableStars::update(const UpdateData& data) {
if (_program->isDirty()) {
_program->rebuildFromFile();
_dataIsDirty = true;
}
if (_dataIsDirty) {
const int value = _colorOption;
LDEBUG("Regenerating data");
+13 -3
View File
@@ -31,6 +31,7 @@
#include <ghoul/opengl/programobject.h>
#include <ghoul/misc/highresclock.h>
#include <openspace/engine/openspaceengine.h>
#include <openspace/rendering/renderengine.h>
#include <openspace/interaction/interactionhandler.h>
#include <limits>
@@ -119,9 +120,13 @@ bool RenderableTrail::initialize() {
}
bool completeSuccess = true;
_programObject = ghoul::opengl::ProgramObject::Build("EphemerisProgram",
RenderEngine* renderEngine = OsEng.renderEngine();
_programObject = renderEngine->buildRenderProgram("EphemerisProgram",
"${MODULE_BASE}/shaders/ephemeris_vs.glsl",
"${MODULE_BASE}/shaders/ephemeris_fs.glsl");
if (!_programObject)
return false;
@@ -131,6 +136,13 @@ bool RenderableTrail::initialize() {
bool RenderableTrail::deinitialize() {
glDeleteVertexArrays(1, &_vaoID);
glDeleteBuffers(1, &_vBufferID);
RenderEngine* renderEngine = OsEng.renderEngine();
if (_programObject) {
renderEngine->removeRenderProgram(_programObject);
_programObject = nullptr;
}
return true;
}
@@ -198,8 +210,6 @@ void RenderableTrail::update(const UpdateData& data) {
return;
}
if (_programObject->isDirty())
_programObject->rebuildFromFile();
double lightTime = 0.0;
psc pscPos;
@@ -22,24 +22,23 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
#version __CONTEXT__
uniform vec4 campos;
uniform vec4 objpos;
//uniform vec3 camdir; // add this for specular
in vec4 vs_position;
#include "ABuffer/abufferStruct.hglsl"
#include "ABuffer/abufferAddToBuffer.hglsl"
#include "PowerScaling/powerScaling_fs.hglsl"
#include "fragment.glsl"
//#include "PowerScaling/powerScaling_vs.hglsl"
void main()
Fragment getFragment()
{
vec4 position = vs_position;
float depth = pscDepth(position);
Fragment frag;
ABufferStruct_t frag = createGeometryFragment(vec4(1.0, 0.0, 0.0, 1.0), position, depth);
addToBuffer(frag);
}
frag.color = vec4(1.0, 0.0, 0.0, 1.0);
frag.depth = depth;
return frag;
}
+8 -8
View File
@@ -22,8 +22,6 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
#version __CONTEXT__
in vec4 vs_point_position;
in vec4 vs_point_velocity;
in float fade;
@@ -31,15 +29,17 @@ uniform float forceFade;
uniform vec3 color;
#include "ABuffer/abufferStruct.hglsl"
#include "ABuffer/abufferAddToBuffer.hglsl"
#include "PowerScaling/powerScaling_fs.hglsl"
#include "fragment.glsl"
void main() {
Fragment getFragment() {
vec4 position = vs_point_position;
float depth = pscDepth(position);
vec4 c = vec4(color, fade*forceFade);
ABufferStruct_t frag = createGeometryFragment(c, position, depth);
addToBuffer(frag);
}
Fragment frag;
frag.color = c;
frag.depth = depth;
return frag;
}
+8 -9
View File
@@ -22,19 +22,16 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
#version __CONTEXT__
uniform float time;
uniform sampler2D texture1;
in vec2 vs_st;
in vec4 vs_position;
#include "ABuffer/abufferStruct.hglsl"
#include "ABuffer/abufferAddToBuffer.hglsl"
#include "PowerScaling/powerScaling_fs.hglsl"
#include "fragment.glsl"
void main()
Fragment getFragment()
{
vec4 position = vs_position;
float depth = pscDepth(position);
@@ -44,7 +41,9 @@ void main()
else {
diffuse = vec4(0.8);
}
ABufferStruct_t frag = createGeometryFragment(diffuse, position, depth);
addToBuffer(frag);
}
Fragment frag;
frag.color = diffuse;
frag.depth = depth;
return frag;
}
+10 -20
View File
@@ -22,8 +22,6 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
#version __CONTEXT__
uniform vec4 campos;
uniform vec4 objpos;
uniform vec3 cam_dir; // add this for specular
@@ -43,20 +41,16 @@ in vec2 vs_st;
in vec4 vs_normal;
in vec4 vs_position;
#include "ABuffer/abufferStruct.hglsl"
#include "ABuffer/abufferAddToBuffer.hglsl"
#include "PowerScaling/powerScaling_fs.hglsl"
#include "fragment.glsl"
//#include "PowerScaling/powerScaling_vs.hglsl"
void main()
{
Fragment getFragment() {
vec4 position = vs_position;
float depth = pscDepth(position);
//depth = length(campos - position);
vec4 diffuse = texture(texture1, vs_st);
diffuse[3] = fading;
if (_performShading) {
vec4 spec = vec4(0.0);
@@ -79,16 +73,12 @@ void main()
spec = specular * pow(intSpec, shine);
}
diffuse = vec4(max(intensity * diffuse , ambient).xyz,1) +spec*1.5*diffuse ;
diffuse[3] = fading*transparency;
ABufferStruct_t frag = createGeometryFragment(diffuse, position, depth);
addToBuffer(frag);
}
else {
diffuse[3] = fading*transparency;
ABufferStruct_t frag = createGeometryFragment(diffuse, position, depth);
addToBuffer(frag);
}
}
diffuse[3] = fading*transparency;
Fragment frag;
frag.color = diffuse;
frag.depth = depth;
return frag;
}
+7 -8
View File
@@ -22,24 +22,23 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
#version __CONTEXT__
in vec4 vs_point_position;
flat in int isHour;
in vec4 vs_point_color;
uniform vec3 color;
#include "ABuffer/abufferStruct.hglsl"
#include "ABuffer/abufferAddToBuffer.hglsl"
#include "PowerScaling/powerScaling_fs.hglsl"
#include "fragment.glsl"
void main() {
Fragment getFragment() {
vec4 position = vs_point_position;
float depth = pscDepth(position);
vec4 diffuse = vs_point_color;
ABufferStruct_t frag = createGeometryFragment(diffuse, position, depth);
addToBuffer(frag);
Fragment frag;
frag.color = diffuse;
frag.depth = depth;
return frag;
}
+9 -11
View File
@@ -22,20 +22,16 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
#version __CONTEXT__
uniform float time;
uniform sampler2D texture1;
in vec2 vs_st;
in vec4 vs_position;
#include "ABuffer/abufferStruct.hglsl"
#include "ABuffer/abufferAddToBuffer.hglsl"
#include "PowerScaling/powerScaling_fs.hglsl"
#include "fragment.glsl"
void main()
{
Fragment getFragment() {
vec4 position = vs_position;
float depth = pscDepth(position);
vec4 diffuse;
@@ -50,10 +46,12 @@ void main()
// diffuse = vec4(1,0,0,1);
// }
ABufferStruct_t frag = createGeometryFragment(diffuse, position, depth);
addToBuffer(frag);
gl_FragDepth = depth;
if (diffuse.a == 0.0)
discard;
}
Fragment frag;
frag.color = diffuse;
frag.depth = depth;
return frag;
}
+8 -11
View File
@@ -22,8 +22,6 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
#version __CONTEXT__
uniform float time;
uniform sampler2D texture1;
uniform float alpha;
@@ -31,16 +29,14 @@ uniform float alpha;
in vec2 vs_st;
in vec4 vs_position;
#include "ABuffer/abufferStruct.hglsl"
#include "ABuffer/abufferAddToBuffer.hglsl"
#include "fragment.glsl"
#include "PowerScaling/powerScaling_fs.hglsl"
void main()
Fragment getFragment()
{
vec4 position = vs_position;
// This has to be fixed with the ScaleGraph in place (precision deficiency in depth buffer) ---abock
// float depth = pscDepth(position);
float depth = 200;
float depth = pscDepth(position);
vec4 diffuse;
vec2 texCoord = vs_st;
@@ -75,7 +71,8 @@ void main()
//diffuse = vec4(1.0, 0.0, 0.0, 1.0);
ABufferStruct_t frag = createGeometryFragment(diffuse, position, depth);
addToBuffer(frag);
}
Fragment frag;
frag.color = diffuse;
frag.depth = depth;
return frag;
}
+13 -19
View File
@@ -22,7 +22,6 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
****************************************************************************************/
#version __CONTEXT__
// keep in sync with renderablestars.h:ColorOption enum
const int COLOROPTION_COLOR = 0;
@@ -42,8 +41,7 @@ in float ge_speed;
in vec2 texCoord;
in float billboardSize;
#include "ABuffer/abufferStruct.hglsl"
#include "ABuffer/abufferAddToBuffer.hglsl"
#include "fragment.glsl"
#include "PowerScaling/powerScaling_fs.hglsl"
uniform vec2 magnitudeClamp;
@@ -56,7 +54,7 @@ vec4 bv2rgb(float bv) {
return texture(colorTexture, t);
}
void main() {
Fragment getFragment() {
// Something in the color calculations need to be changed because before it was dependent
// on the gl blend functions since the abuffer was not involved
@@ -77,21 +75,17 @@ void main() {
vec4 textureColor = texture(psfTexture, texCoord);
vec4 fullColor = vec4(color.rgb, textureColor.a);
if (minBillboardSize != 1.0) {
float normSize = (billboardSize - 1.0) / (minBillboardSize - 1.0);
normSize = pow(normSize, 3);
fullColor *= clamp(normSize, 0.0, 1.0);
vec4 position = vs_position;
// This has to be fixed when the scale graph is in place ---emiax
position.w = 19;
Fragment frag;
frag.color = fullColor;
frag.depth = pscDepth(position);
if (fullColor.a == 0) {
discard;
}
vec4 position = vs_position;
// This has to be fixed when the scale graph is in place ---abock
float depth = pscDepth(position) + 1;
// float depth = 10000.0;
// gl_FragDepth = depth;
ABufferStruct_t frag = createGeometryFragment(fullColor, position, depth);
addToBuffer(frag);
if (fullColor.a == 0)
discard;
return frag;
}
+4 -3
View File
@@ -53,6 +53,7 @@ out float billboardSize;
uniform mat4 projection;
uniform float scaleFactor;
uniform float minBillboardSize;
void main() {
if ((psc_position[0].x == 0.0) && (psc_position[0].y == 0.0) && (psc_position[0].z == 0.0))
@@ -68,8 +69,8 @@ void main() {
vec4 projPos[4];
for (int i = 0; i < 4; ++i) {
vec4 p1 = gl_in[0].gl_Position;
p1.xy += vec2(modifiedSpriteSize * (corners[i] - vec2(0.5)));
vec4 p1 = gl_in[0].gl_Position;
p1.xy += vec2(modifiedSpriteSize * (corners[i] - vec2(0.5)));
projPos[i] = projection * p1;
}
@@ -82,7 +83,7 @@ void main() {
// The billboard is smaller than one pixel, we can discard it
vec2 distance = abs(ll - ur);
float sizeInPixels = length(distance);
if (sizeInPixels < 5)
if (sizeInPixels < minBillboardSize)
return;
for(int i = 0; i < 4; i++){