moin !
ich hab vor kurzem angefangen mich in shader(glsl) einzuarbeiten und bräuchte eine textur mit dem abbild des gesamten bildschirms um postprocessingeffekte zu benutzen (blabla unwichtig)..
jedenfalls benutze ich dafür framebufferobjekte. hab alles initialisiert und rendern lässt es sich auch einigermaßen, nur scheint es ein problem mit der transformation oä. zu geben.
wie es aussieht: *klick*
wie es aussehen sollte:*klick
code für die initialisierung des framebuffer objekts
Spoiler anzeigen
code zum rendern
Spoiler anzeigen
vielleicht kennt sich ja jemand von euch besser aus, danke im voraus :)
ich hab vor kurzem angefangen mich in shader(glsl) einzuarbeiten und bräuchte eine textur mit dem abbild des gesamten bildschirms um postprocessingeffekte zu benutzen (blabla unwichtig)..
jedenfalls benutze ich dafür framebufferobjekte. hab alles initialisiert und rendern lässt es sich auch einigermaßen, nur scheint es ein problem mit der transformation oä. zu geben.
wie es aussieht: *klick*
wie es aussehen sollte:*klick
code für die initialisierung des framebuffer objekts
[cpp]
GLuint fbo;
GLuint fbo_texture;
void CGraphics_OpenGL::InitFrameBuffer()
{
InitFrameBufferTexture();
glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, fbo_texture, 0);
GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
dbg_msg("gfx", "failed to create fbo");
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
void CGraphics_OpenGL::InitFrameBufferTexture()
{
glGenTextures(1, &fbo_texture);
glBindTexture(GL_TEXTURE_2D, fbo_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_ScreenWidth, m_ScreenHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
}
[/cpp]
GLuint fbo;
GLuint fbo_texture;
void CGraphics_OpenGL::InitFrameBuffer()
{
InitFrameBufferTexture();
glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, fbo_texture, 0);
GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
dbg_msg("gfx", "failed to create fbo");
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
void CGraphics_OpenGL::InitFrameBufferTexture()
{
glGenTextures(1, &fbo_texture);
glBindTexture(GL_TEXTURE_2D, fbo_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_ScreenWidth, m_ScreenHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
}
[/cpp]
code zum rendern
[cpp]
void CGraphics_OpenGL::Flush()
{
if(m_NumVertices == 0)
return;
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glVertexPointer(3, GL_FLOAT,
sizeof(CVertex),
(char*)m_aVertices);
glTexCoordPointer(2, GL_FLOAT,
sizeof(CVertex),
(char*)m_aVertices + sizeof(float)*3);
glColorPointer(4, GL_FLOAT,
sizeof(CVertex),
(char*)m_aVertices + sizeof(float)*5);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
if(m_RenderEnable)
{
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
if(m_Drawing == DRAWING_QUADS)
glDrawArrays(GL_QUADS, 0, m_NumVertices);
else if(m_Drawing == DRAWING_LINES)
glDrawArrays(GL_LINES, 0, m_NumVertices);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
FrameBufferToScreen();
}
// Reset pointer
m_NumVertices = 0;
}
void CGraphics_OpenGL::FrameBufferToScreen()
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, fbo_texture);
DrawQuad(0, 0, m_ScreenWidth, m_ScreenHeight); // zeichnet ein fullscreen quad
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
}
[/cpp]
void CGraphics_OpenGL::Flush()
{
if(m_NumVertices == 0)
return;
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glVertexPointer(3, GL_FLOAT,
sizeof(CVertex),
(char*)m_aVertices);
glTexCoordPointer(2, GL_FLOAT,
sizeof(CVertex),
(char*)m_aVertices + sizeof(float)*3);
glColorPointer(4, GL_FLOAT,
sizeof(CVertex),
(char*)m_aVertices + sizeof(float)*5);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
if(m_RenderEnable)
{
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
if(m_Drawing == DRAWING_QUADS)
glDrawArrays(GL_QUADS, 0, m_NumVertices);
else if(m_Drawing == DRAWING_LINES)
glDrawArrays(GL_LINES, 0, m_NumVertices);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
FrameBufferToScreen();
}
// Reset pointer
m_NumVertices = 0;
}
void CGraphics_OpenGL::FrameBufferToScreen()
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, fbo_texture);
DrawQuad(0, 0, m_ScreenWidth, m_ScreenHeight); // zeichnet ein fullscreen quad
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
}
[/cpp]
vielleicht kennt sich ja jemand von euch besser aus, danke im voraus :)