jra101: Heres the sample code, its just the code from http://openvidia.sourceforge.net/simpleFBO.c . When I run the code as it is on the site, I get complete FBO’s and it all works. If I replace GL_TEXTURE_RECTANGLE_NV’s with GL_TEXTURE_2D’s, it reports FBO incomplete!
As for stencil buffers - I dont know how on earth you’re getting them to work, because I’m using the same hardware and drivers, and the experience I and others on this forum have had simply point to the driver not supporting it at all? As I’ve said, i’ve stepped through the nvidia GL dll with the VC++ disassembler, and theres what must be a switch statement on the type you’re passing in, DEPTH_COMPONENT, RGB, RGBA and a few similar ones are in there, but the STENCIL_INDEX ones arent! So I cannot understand how you could be initializing a working stencil buffer? 
Thanks for any help though, becaues I would absolutely LOVE for them to work!
Oh, and what GL driver settings are you using? Somewhere either on this forum or on gamedev someone reported that when they had anisotropic filtering NOT set to “application defined” they got FBO’s returning incomplete, when they set it to that it worked. Maybe whatever settings you’re using enable you to turn TEXTURE_2D & STENCIL_INDEX on, and I cant? I’ve tried all AA modes, and anisotropic to off, user defined, and some of the smaller values for it.
#include <GL/glut.h>
#include <GL/glext.h>
#include <stdio.h>
#include <assert.h>
GLuint fb,depth_rb,tex;
#define CHECK_FRAMEBUFFER_STATUS() \
{\
GLenum status; \
status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); \
fprintf(stderr, "%x
", status);\
switch(status) { \
case GL_FRAMEBUFFER_COMPLETE_EXT: \
fprintf(stderr,"framebuffer complete!
");\
break; \
case GL_FRAMEBUFFER_UNSUPPORTED_EXT: \
fprintf(stderr,"framebuffer GL_FRAMEBUFFER_UNSUPPORTED_EXT
");\
/* you gotta choose different formats */ \
assert(0); \
break; \
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT: \
fprintf(stderr,"framebuffer INCOMPLETE_ATTACHMENT
");\
break; \
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT: \
fprintf(stderr,"framebuffer FRAMEBUFFER_MISSING_ATTACHMENT
");\
break; \
case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT: \
fprintf(stderr,"framebuffer FRAMEBUFFER_DIMENSIONS
");\
break; \
case GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT: \
fprintf(stderr,"framebuffer INCOMPLETE_DUPLICATE_ATTACHMENT
");\
break; \
case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT: \
fprintf(stderr,"framebuffer INCOMPLETE_FORMATS
");\
break; \
case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT: \
fprintf(stderr,"framebuffer INCOMPLETE_DRAW_BUFFER
");\
break; \
case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT: \
fprintf(stderr,"framebuffer INCOMPLETE_READ_BUFFER
");\
break; \
case GL_FRAMEBUFFER_BINDING_EXT: \
fprintf(stderr,"framebuffer BINDING_EXT
");\
break; \
/*
case GL_FRAMEBUFFER_STATUS_ERROR_EXT: \
fprintf(stderr,"framebuffer STATUS_ERROR
");\
break; \
*/ \
default: \
/* programming error; will fail on all hardware */ \
assert(0); \
}\
}
PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT = 0;
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT = 0;
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT = 0;
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT = 0;
void InitFBO()
{
glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) wglGetProcAddress("glGenFramebuffersEXT");
glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) wglGetProcAddress("glBindFramebufferEXT");
glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) wglGetProcAddress("glCheckFramebufferStatusEXT");
glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) wglGetProcAddress("glFramebufferTexture2DEXT");
}
int imageWinWidth = 256;
int imageWinHeight = 256;
void reshape(int w, int h)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(0.0, 1.0, 1.0, 0.0, 1.0, 100.0);
gluLookAt(0.0,0.0,0.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glutPostRedisplay();
}
static GLenum errCode;
const GLubyte *errString;
void errcheck() {
if ((errCode = glGetError()) != GL_NO_ERROR) {
errString = gluErrorString(errCode);
fprintf (stderr, "OpenGL Error: %s
", errString);
exit(1);
}
}
void myIdle(void)
{
glutPostRedisplay();
}
void keyboard (unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
break;
default:
break;
}
}
void MouseFunc( int button, int state, int x, int y)
{
switch(button) {
case GLUT_LEFT_BUTTON :
break;
case GLUT_RIGHT_BUTTON :
break;
}
}
void render_redirect(void)
{
//bind the FBO, and the associated texture.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);
// draw a scene. the results are being
// written into the associated texture,'tex'
glClearColor(0.0, 0.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor4f( 1.0, 1.0, 1.0, 1.0);
glLineWidth(5.0);
glBegin(GL_LINES);
glColor4f( 1.0, 1.0, 1.0, 1.0);
glVertex3f( 0.0, 0.0, -1.0);
glVertex3f( 1.0, 1.0, -1.0);
glEnd();
// 'unbind' the FBO. things will now be drawn to screen as usual
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glClearColor(0.0, 1.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glEnable(GL_TEXTURE_RECTANGLE_NV);
glBindTexture(GL_TEXTURE_RECTANGLE_NV, tex);
// draw the 'tex' texture containing the framebuffer rendered drawing.
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex3f(0.0, 0.0, -1.0);
glTexCoord2f(0, 256);
glVertex3f(0.0, .5, -1.0);
glTexCoord2f(256,256);
glVertex3f(.5,.5, -1.0);
glTexCoord2f(256,0);
glVertex3f(.5, 0.0, -1.0);
glEnd();
glDisable(GL_TEXTURE_RECTANGLE_NV);
glutSwapBuffers();
}
int main(int argc, char *argv[] ) {
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(imageWinWidth, imageWinHeight);
glutCreateWindow(argv[0]);
InitFBO();
//gen the frambuffer object (FBO), similar manner as a texture
glGenFramebuffersEXT(1, &fb);
errcheck();
// make a texture
glGenTextures(1, &tex); // texture
//bind the framebuffer, fb, so operations will now occur on it
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);
// initialize texture that will store the framebuffer image
glBindTexture(GL_TEXTURE_RECTANGLE_NV, tex);
glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_RGBA, 256,256, 0,
GL_RGBA, GL_UNSIGNED_BYTE,NULL);
errcheck();
// bind this texture to the current framebuffer obj. as
// color_attachement_0
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_NV, tex, 0);
errcheck();
//see if everything is OK
CHECK_FRAMEBUFFER_STATUS()
//'unbind' the frambuffer object, so subsequent drawing ops are not
// drawn into the FBO.
// '0' means "windowing system provided framebuffer
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glutDisplayFunc(render_redirect);
glutIdleFunc(myIdle);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMouseFunc(MouseFunc);
glutMainLoop();
return 0;
}