diff options
author | Markus Mohrhard <markus.mohrhard@collabora.co.uk> | 2014-05-06 07:00:28 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2014-05-06 07:25:50 +0200 |
commit | 37ec4aefdf054c28bf6f2d3d283dad0f3a799884 (patch) | |
tree | 6b32c8fc81dfc5bb1a14b8d2e9b4b4350bb1567d /chart2 | |
parent | 81074d60801b5ca1c29f7f8127de5c62d652dce1 (diff) |
more 3D rendering fixes
Change-Id: I8943355de1b9440104e0281131fb0df3fc599bb4
Diffstat (limited to 'chart2')
-rw-r--r-- | chart2/source/view/inc/GL3DRenderer.hxx | 5 | ||||
-rw-r--r-- | chart2/source/view/main/3DChartObjects.cxx | 1 | ||||
-rw-r--r-- | chart2/source/view/main/GL3DRenderer.cxx | 55 |
3 files changed, 61 insertions, 0 deletions
diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx index 4782f5047482..59b9b0088830 100644 --- a/chart2/source/view/inc/GL3DRenderer.hxx +++ b/chart2/source/view/inc/GL3DRenderer.hxx @@ -158,6 +158,7 @@ class OpenGL3DRenderer : public IOpenGLInfoProvider public: OpenGL3DRenderer(); + void CreateFrameBufferObj(); void LoadShaders(); void init(); virtual bool isOpenGLInitialized() SAL_OVERRIDE; @@ -288,8 +289,12 @@ private: GLint m_MatrixID; + GLuint m_TextureObj[2]; + GLuint m_FboID[2]; + GLuint m_RboID[2]; + Extrude3DInfo m_Extrude3DInfo; std::vector <Extrude3DInfo> m_Extrude3DList; diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx index 4f9da3317df8..d45dc9f09203 100644 --- a/chart2/source/view/main/3DChartObjects.cxx +++ b/chart2/source/view/main/3DChartObjects.cxx @@ -91,6 +91,7 @@ void TemporaryContext::init() Size winSize(800, 600); maContext.setWinSize(winSize); mpRenderer->SetSize(winSize); + mpRenderer->init(); } } diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx index 651fca461bff..b28e42e5caca 100644 --- a/chart2/source/view/main/GL3DRenderer.cxx +++ b/chart2/source/view/main/GL3DRenderer.cxx @@ -100,6 +100,28 @@ OpenGL3DRenderer::OpenGL3DRenderer(): m_CameraInfo.cameraUp = glm::vec3(0, 1, 0); } +void OpenGL3DRenderer::CreateFrameBufferObj() +{ + // create a framebuffer object, you need to delete them when program exits. + glGenFramebuffers(2, m_FboID); + glCheckFramebufferStatus(GL_FRAMEBUFFER); + for (int i = 0; i < 2; i++) + { + glBindFramebuffer(GL_FRAMEBUFFER, m_FboID[i]); + glBindTexture(GL_TEXTURE_2D, m_TextureObj[i]); + // attach a texture to FBO color attachement point + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_TextureObj[i], 0); + glCheckFramebufferStatus(GL_FRAMEBUFFER); + glBindTexture(GL_TEXTURE_2D, 0); + // attach a renderbuffer to depth attachment point + glBindRenderbuffer(GL_RENDERBUFFER, m_RboID[i]); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_RboID[i]); + glCheckFramebufferStatus(GL_FRAMEBUFFER); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + } +} + void OpenGL3DRenderer::LoadShaders() { m_3DProID = OpenGLHelper::LoadShaders("Shape3DVertexShader", "Shape3DFragmentShader"); @@ -110,6 +132,12 @@ void OpenGL3DRenderer::LoadShaders() m_3DVertexID = glGetAttribLocation(m_3DProID, "vertexPositionModelspace"); m_3DNormalID = glGetAttribLocation(m_3DProID, "vertexNormalModelspace"); + m_CommonProID = OpenGLHelper::LoadShaders("commonVertexShader", "commonFragmentShader"); + m_MatrixID = glGetUniformLocation(m_CommonProID, "MVP"); + m_2DVertexID = glGetAttribLocation(m_CommonProID, "vPosition"); + m_2DColorID = glGetUniformLocation(m_CommonProID, "vColor"); + CHECK_GL_ERROR(); + Init3DUniformBlock(); } @@ -127,6 +155,32 @@ void OpenGL3DRenderer::SetCameraInfo(glm::vec3 pos, glm::vec3 direction, glm::ve void OpenGL3DRenderer::init() { + if (glewIsSupported("framebuffer_object") != GLEW_OK) + { + SAL_WARN("chart2.opengl", "GL stack has no framebuffer support"); + return; + } + + glEnable(GL_TEXTURE_2D); + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + // Enable depth test + glEnable(GL_DEPTH_TEST); + // Accept fragment if it closer to the camera than the former one + glDepthFunc(GL_LESS); + glEnable(GL_POINT_SMOOTH); + glEnable(GL_LINE_SMOOTH); + glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); + glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glClearColor (1.0, 1.0, 1.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + glClearDepth(1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glGenBuffers(1, &m_CubeVertexBuf); AddVertexData(m_CubeVertexBuf); @@ -155,6 +209,7 @@ void OpenGL3DRenderer::init() m_3DProjection = glm::perspective(30.0f, (float)m_iWidth / (float)m_iHeight, 0.01f, 2000.0f); LoadShaders(); + CreateFrameBufferObj(); m_IsOpenglInit = true; } |