FBO problem

"[email protected]" <[email protected]> Tue, 29 Jul 2008 22:45:24 -0800
Newsgroups gmane.games.devel.opengl
Organization Fat City Network Services, San Diego, California
Message-ID <[email protected]>
<div><br></div>Hello Guys<br><br>I am playing a little bit with FBO. By t=
he
way,=20
I am rendering a little red <br>quad in the middle of the FBO. It works
perfect=20
while I use<br><br>&nbsp; glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, 4, w, =
h,
0,=20
GL_RGBA, <br>GL_UNSIGNED_BYTE, NULL);<br><br>yeah...a 8 bits FBO. I can
change=20
GL_UNSIGNED_BYTE by GL_FLOAT, and I always <br>get a 8 bits FBO... (well
known=20
behaviour).<br><br>But, If I just change that command by<br><br>&nbsp;=20
glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_RGBA16_NV, w, h,=20
<br>0,GL_RGBA, GL_UNSIGNED_SHORT, NULL);<br><br>or even by<br><br>&nbsp;=20
glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_FLOAT_RGBA32_NV, w, h,=20
<br>0,GL_RGBA, GL_FLOAT, NULL);<br><br>then, I get a full screen red imag=
e
(even=20
if I comment the glBegin(QUADS) - <br>glEnd() block to render the quad).
The=20
entire FBO gets the color of my <br>glColor3ub(255,0,0).<br><br>I have te=
st=20
every OpenGL code line with glGetError(), and there is not any <br>error.=
 I
also=20
installed latest glew and drivers for my 8800 NVidia graphics=20
<br>board.<br><br>I hope some of you could have a suggestion about what I
am=20
doing wrong.<br><br>Thanks a lot!<br>Rhadam=E9s<br><br><br>#include
"glew.h"<br>#include &lt;gl/glut.h&gt;<br>#include
&lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include
&lt;iostream&gt;<br><br>#define GL_TEXTURE_RECTANGLE
GL_TEXTURE_RECTANGLE_NV<br><br>int height=3D0, width=3D0;<br>GLuint
g_fb=3D0;<br>GLuint g_tex=3D0;<br>GLuint g_depth=3D0;<br><br>using namesp=
ace
std;<br><br><br>void Abort(char *msg)<br>{<br>&nbsp; printf(msg);<br>&nbs=
p;
exit(1);<br>}<br><br><br><br>void CheckErrorsGL(const char* location=3DNU=
LL,
ostream&amp; ostr=3D std::cerr ) <br>{<br>&nbsp; GLuint errnum;<br>&nbsp;
const char *errstr;<br>&nbsp; int counter =3D 0;<br>&nbsp; while (errnum =
=3D
glGetError()) <br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; errstr =3D
reinterpret_cast&lt;const char
*&gt;(gluErrorString(errnum));<br>&nbsp;&nbsp;&nbsp; if(errstr)
<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ostr &lt;&lt;
errstr; <br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else
<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ostr &lt;&lt;
"Error " &lt;&lt; errnum;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;
&nbsp;<br>&nbsp;&nbsp;&nbsp; if(location)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ostr &lt;&lt; " at " &lt;&lt;
location;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ost=
r
&lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; counter++;<br>&nbsp; }<br>&nbsp; if
(counter)<br>&nbsp;&nbsp;&nbsp; Abort("Application cannot
continue!\n");<br><br>&nbsp; return;<br>}<br><br>void
TestOpenGLError()<br>{<br>&nbsp; CheckErrorsGL(NULL);<br>}<br><br><br>voi=
d
Draw()<br>{<br>&nbsp; // working with main object (the
application)<br>&nbsp; if (!width || !height)<br>&nbsp;&nbsp;&nbsp;
return;<br><br>&nbsp; glClearColor(0,0,0,0);<br>&nbsp;
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); <br><br><br>&nbsp;
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_fb);&nbsp;
TestOpenGLError();<br>&nbsp; glDrawBuffer( GL_COLOR_ATTACHMENT0_EXT
);&nbsp; TestOpenGLError();<br>&nbsp; glViewport(0,0,width, height);&nbsp=
;
TestOpenGLError();<br>&nbsp; glClearColor(0,0,0,0);&nbsp;&nbsp;
TestOpenGLError();<br>&nbsp; glClear(GL_COLOR_BUFFER_BIT);&nbsp;
TestOpenGLError();<br><br><br>&nbsp; float size =3D 100.0f;<br><br>&nbsp;
glColor3f(1,0,0.5f);<br>&nbsp; glBegin(GL_QUADS);<br>&nbsp;&nbsp;&nbsp;
glVertex2f(width*0.5f - size, height*0.5f - size);<br>&nbsp;&nbsp;&nbsp;
glVertex2f(width*0.5f - size, height*0.5f + size);<br>&nbsp;&nbsp;&nbsp;
glVertex2f(width*0.5f + size, height*0.5f + size);<br>&nbsp;&nbsp;&nbsp;
glVertex2f(width*0.5f + size, height*0.5f - size);<br>&nbsp;
glEnd();<br>&nbsp; //glColor3ub(0,0,0);<br><br><br><br>&nbsp; <br>&nbsp;
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);<br>&nbsp; glDrawBuffer(
GL_BACK );<br>&nbsp; glViewport(0,0,width, height);&nbsp;
TestOpenGLError();<br>&nbsp; glFinish();<br>&nbsp;
glEnable(GL_TEXTURE_RECTANGLE);<br>&nbsp;
glBindTexture(GL_TEXTURE_RECTANGLE, g_tex);&nbsp;
TestOpenGLError();<br>&nbsp; glEnable(GL_TEXTURE_RECTANGLE);&nbsp;
TestOpenGLError();<br>&nbsp;&nbsp;&nbsp; <br><br>&nbsp;
glBegin(GL_QUADS);<br>&nbsp;&nbsp;&nbsp; glTexCoord2f(0.0f,
0.0f);<br>&nbsp;&nbsp;&nbsp; glVertex2f(0.0f, 0.0f);<br>&nbsp;&nbsp;&nbsp=
;
glTexCoord2f(0.0f, height);<br>&nbsp;&nbsp;&nbsp; glVertex2f(0.0f,
height);<br>&nbsp;&nbsp;&nbsp; glTexCoord2f(width,
height);<br>&nbsp;&nbsp;&nbsp; glVertex2f(width,
height);<br>&nbsp;&nbsp;&nbsp; glTexCoord2f(width,
0.0f);<br>&nbsp;&nbsp;&nbsp; glVertex2f(width, 0.0f);<br>&nbsp;
glEnd();<br><br>&nbsp; glDisable(GL_TEXTURE_RECTANGLE);&nbsp;
TestOpenGLError();<br>&nbsp; // back to 3D mode<br><br><br>&nbsp;
glFinish();<br>&nbsp; glutSwapBuffers();<br>}<br><br>void
Init()<br>{<br>&nbsp; GLenum err =3D glewInit();<br>&nbsp; if (GLEW_OK !=3D
err)<br>&nbsp;&nbsp;&nbsp; // Problem: glewInit failed, something is
seriously wrong. <br>&nbsp;&nbsp;&nbsp; Abort("init
error\n");<br><br><br>&nbsp; TestOpenGLError();<br>&nbsp;
glGenFramebuffersEXT(1,
&amp;g_fb);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp
;&nbsp;&nbsp; TestOpenGLError();<br>&nbsp; glBindTexture(GL_TEXTURE_2D,
0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;
TestOpenGLError();<br>&nbsp; glBindTexture(GL_TEXTURE_RECTANGLE,
0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TestOpenGLError();<br>&nbsp;
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_fb);
TestOpenGLError();<br><br>&nbsp; // create the texture for the
color<br>&nbsp; glGenTextures(1,
&amp;g_tex);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbs
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
TestOpenGLError();<br>&nbsp; glBindTexture(GL_TEXTURE_RECTANGLE,
g_tex);&nbsp; TestOpenGLError();<br><br>&nbsp; glTexParameteri
(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP);<br>&nbsp;
glTexParameteri (GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T,
GL_CLAMP);<br>&nbsp; glTexParameteri (GL_TEXTURE_RECTANGLE,
GL_TEXTURE_MAG_FILTER, GL_NEAREST);<br>&nbsp; glTexParameteri
(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
TestOpenGLError();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbs
p; <br><br>&nbsp; //glTexImage2D(GL_TEXTURE_RECTANGLE, 0, 4, width, heigh=
t,
0, GL_RGBA, GL_UNSIGNED_BYTE,
NULL);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//works<br>&nbsp; //glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA16, widt=
h,
height, 0,GL_RGBA, GL_UNSIGNED_SHORT, NULL);&nbsp; //works<br>&nbsp;
//glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_FLOAT_RGBA32_NV, w, h,
0,GL_RGBA, GL_FLOAT,
NULL);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //does
not work<br>&nbsp; glTexImage2D(GL_TEXTURE_RECTANGLE, 0,
GL_FLOAT_RGBA16_NV, width, height, 0,GL_RGBA, GL_UNSIGNED_SHORT, NULL);
<br>&nbsp; <br>&nbsp; TestOpenGLError();<br>&nbsp;
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_=
TEX
TURE_RECTANGLE,g_tex, 0);<br>&nbsp; if
(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) !=3D
GL_FRAMEBUFFER_COMPLETE_EXT)<br>&nbsp;&nbsp;&nbsp; Abort("Error adding
color to FBO\n");<br>&nbsp; TestOpenGLError();<br><br>&nbsp;
glMatrixMode(GL_PROJECTION);<br>&nbsp; glLoadIdentity();<br>&nbsp;
glOrtho(0,width,0,height,-1,100.0f);<br>&nbsp;
glMatrixMode(GL_TEXTURE);<br>&nbsp; glLoadIdentity();<br>&nbsp;
glMatrixMode(GL_MODELVIEW);<br>&nbsp; glLoadIdentity();<br>&nbsp;
glTranslatef(0,0,-5);<br>}<br><br>void Reshape(int w, int h)<br>{<br>&nbs=
p;
width =3D w;<br>&nbsp; height=3D h;<br>&nbsp;
glViewport(0,0,width,height);<br>&nbsp; Init();<br>}<br><br><br>void
main(int argc, char **argv)<br>{<br>&nbsp; glutInit(&amp;argc,
argv);<br>&nbsp; glutInitDisplayString("double blue&gt;=3D8 red&gt;=3D8
alpha&gt;=3D8 green&gt;=3D8 depth=3D32");// rgba&gt;=3D8 depth&gt;=3D24")=
;<br>&nbsp;
glutInitWindowSize(640,480);<br>&nbsp;
glutInitWindowPosition(0,0);<br>&nbsp; glutCreateWindow("test");<br>&nbsp=
;
glutSetWindowTitle("test");<br><br><br>&nbsp; glutIdleFunc(Draw);<br>&nbs=
p;
glutDisplayFunc(Draw);<br>&nbsp; glutReshapeFunc(Reshape);<br><br>&nbsp;
glutShowWindow();<br>&nbsp; glutMainLoop();<br><br>}<br>&nbsp;

----- 
FAQ and OpenGL Resources at:
  http://www.geocities.com/SiliconValley/Hills/9956/OpenGL

-- 
Author: [email protected]
  INET: [email protected]

Fat City Hosting, San Diego, California -- http://www.fatcity.com
---------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: [email protected] (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB OPENGL-GAMEDEV-L
(or the name of mailing list you want to be removed from).  You may
also send the HELP command for other information (like subscribing).