Kaydet (Commit) 2bbcf97e authored tarafından Markus Mohrhard's avatar Markus Mohrhard Kaydeden (comit) Markus Mohrhard

fix my issues with the offscreen rendering

Change-Id: I4a2ed8a20890119220d63a6768f13365a7b5f97d
üst b8e8c9c4
...@@ -221,11 +221,11 @@ void GL3DBarChart::clickedAt(const Point& rPos) ...@@ -221,11 +221,11 @@ void GL3DBarChart::clickedAt(const Point& rPos)
{ {
sal_uInt32 nId = 1; sal_uInt32 nId = 1;
{ {
PickingModeSetter(mpRenderer.get()); PickingModeSetter aPickingModeSetter(mpRenderer.get());
render(); render();
nId = mpRenderer->GetPixelColorFromPoint(rPos.X(), rPos.Y()); nId = mpRenderer->GetPixelColorFromPoint(rPos.X(), rPos.Y());
} }
if (mpCamera) if (mpCamera && nId != COL_WHITE)
mpCamera->zoom(nId); mpCamera->zoom(nId);
} }
......
...@@ -366,8 +366,8 @@ private: ...@@ -366,8 +366,8 @@ private:
SceneBox m_SenceBox; SceneBox m_SenceBox;
GLuint mnPickingFbo; GLuint mnPickingFbo;
GLuint mnPickingRbo; GLuint mnPickingRboDepth;
GLuint mnPickingTexture; GLuint mnPickingRboColor;
}; };
} }
......
...@@ -112,8 +112,8 @@ OpenGL3DRenderer::~OpenGL3DRenderer() ...@@ -112,8 +112,8 @@ OpenGL3DRenderer::~OpenGL3DRenderer()
glDeleteBuffers(1, &m_VertexBuffer); glDeleteBuffers(1, &m_VertexBuffer);
glDeleteFramebuffers(1, &mnPickingFbo); glDeleteFramebuffers(1, &mnPickingFbo);
glDeleteRenderbuffers(1, &mnPickingRbo); glDeleteRenderbuffers(1, &mnPickingRboDepth);
glDeleteTextures(1, &mnPickingTexture); glDeleteRenderbuffers(1, &mnPickingRboColor);
} }
void OpenGL3DRenderer::ShaderResources::LoadShaders() void OpenGL3DRenderer::ShaderResources::LoadShaders()
...@@ -253,7 +253,7 @@ void OpenGL3DRenderer::init() ...@@ -253,7 +253,7 @@ void OpenGL3DRenderer::init()
glBufferData(GL_ARRAY_BUFFER, sizeof(squareVertices), squareVertices, GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(squareVertices), squareVertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);
OpenGLHelper::createFramebuffer(m_iWidth, m_iHeight, mnPickingFbo, mnPickingRbo, mnPickingTexture); OpenGLHelper::createFramebuffer(m_iWidth, m_iHeight, mnPickingFbo, mnPickingRboDepth, mnPickingRboColor);
CHECK_GL_ERROR(); CHECK_GL_ERROR();
Init3DUniformBlock(); Init3DUniformBlock();
...@@ -1601,6 +1601,9 @@ sal_uInt32 OpenGL3DRenderer::GetPixelColorFromPoint(long nX, long nY) ...@@ -1601,6 +1601,9 @@ sal_uInt32 OpenGL3DRenderer::GetPixelColorFromPoint(long nX, long nY)
boost::scoped_array<sal_uInt8> buf(new sal_uInt8[4]); boost::scoped_array<sal_uInt8> buf(new sal_uInt8[4]);
glReadPixels(nX, nY, 1, 1, GL_BGRA, GL_UNSIGNED_BYTE, buf.get()); glReadPixels(nX, nY, 1, 1, GL_BGRA, GL_UNSIGNED_BYTE, buf.get());
Color aColor(buf[3], buf[2], buf[1], buf[0]); Color aColor(buf[3], buf[2], buf[1], buf[0]);
static sal_Int32 i = 0;
OUString aFileName = OUString("/home/moggi/Documents/work/shader") + OUString::number(i) + ".png";
OpenGLHelper::renderToFile(m_iWidth, m_iHeight, aFileName);
return aColor.GetColor(); return aColor.GetColor();
} }
......
...@@ -32,10 +32,10 @@ public: ...@@ -32,10 +32,10 @@ public:
/** /**
* The caller is responsible for deleting the buffer objects identified by * The caller is responsible for deleting the buffer objects identified by
* nFramebufferId, nRenderbufferId and nTexturebufferId * nFramebufferId, nRenderbufferDepthId and nRenderbufferColorId
*/ */
static void createFramebuffer(long nWidth, long nHeight, static void createFramebuffer(long nWidth, long nHeight,
GLuint& nFramebufferId, GLuint& nRenderbufferId, GLuint& nTexturebufferId); GLuint& nFramebufferId, GLuint& nRenderbufferTextId, GLuint& nRenderbufferColorId);
}; };
VCLOPENGL_DLLPUBLIC std::ostream& operator<<(std::ostream& rStrm, const glm::mat4& rMatrix); VCLOPENGL_DLLPUBLIC std::ostream& operator<<(std::ostream& rStrm, const glm::mat4& rMatrix);
......
...@@ -269,36 +269,31 @@ std::ostream& operator<<(std::ostream& rStrm, const glm::mat4& rMatrix) ...@@ -269,36 +269,31 @@ std::ostream& operator<<(std::ostream& rStrm, const glm::mat4& rMatrix)
} }
void OpenGLHelper::createFramebuffer(long nWidth, long nHeight, void OpenGLHelper::createFramebuffer(long nWidth, long nHeight,
GLuint& nFramebufferId, GLuint& nRenderbufferId, GLuint& nTexturebufferId) GLuint& nFramebufferId, GLuint& nRenderbufferDepthId, GLuint& nRenderbufferColorId)
{ {
// create a renderbuffer // create a renderbuffer for depth attachment
glGenRenderbuffers(1, &nRenderbufferId); glGenRenderbuffers(1, &nRenderbufferDepthId);
glBindRenderbuffer(GL_RENDERBUFFER, nRenderbufferId); glBindRenderbuffer(GL_RENDERBUFFER, nRenderbufferDepthId);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, nWidth, nHeight); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, nWidth, nHeight);
glBindRenderbuffer(GL_RENDERBUFFER, 0); glBindRenderbuffer(GL_RENDERBUFFER, 0);
// create a texture // create a renderbuffer for color attachment
glGenTextures(1, &nTexturebufferId); glGenRenderbuffers(1, &nRenderbufferColorId);
glBindTexture(GL_TEXTURE_2D, nTexturebufferId); glBindRenderbuffer(GL_RENDERBUFFER, nRenderbufferColorId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, nWidth, nHeight);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glBindRenderbuffer(GL_RENDERBUFFER, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, nWidth, nHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D, 0);
// create a framebuffer object and attach renderbuffer and texture // create a framebuffer object and attach renderbuffer and texture
glGenFramebuffers(1, &nFramebufferId); glGenFramebuffers(1, &nFramebufferId);
glCheckFramebufferStatus(GL_FRAMEBUFFER); glCheckFramebufferStatus(GL_FRAMEBUFFER);
glBindFramebuffer(GL_FRAMEBUFFER, nFramebufferId); glBindFramebuffer(GL_FRAMEBUFFER, nFramebufferId);
glBindTexture(GL_TEXTURE_2D, nTexturebufferId); // attach a renderbuffer to FBO color attachement point
// attach a texture to FBO color attachement point glBindRenderbuffer(GL_RENDERBUFFER, nRenderbufferColorId);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, nTexturebufferId, 0); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, nRenderbufferColorId);
glCheckFramebufferStatus(GL_FRAMEBUFFER); glCheckFramebufferStatus(GL_FRAMEBUFFER);
glBindTexture(GL_TEXTURE_2D, 0);
// attach a renderbuffer to depth attachment point // attach a renderbuffer to depth attachment point
glBindRenderbuffer(GL_RENDERBUFFER, nRenderbufferId); glBindRenderbuffer(GL_RENDERBUFFER, nRenderbufferDepthId);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, nRenderbufferId); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, nRenderbufferDepthId);
glCheckFramebufferStatus(GL_FRAMEBUFFER); glCheckFramebufferStatus(GL_FRAMEBUFFER);
glBindRenderbuffer(GL_RENDERBUFFER, 0); glBindRenderbuffer(GL_RENDERBUFFER, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment