Render To Texture only in Ortho mode?

Started by
9 comments, last by MKaprocki 19 years, 7 months ago
I hate asking another question already, since this is my 2nd post in the 2 days I've been here, but I'm really stumped on this. I am using WGL_ARB_render_texture to draw onto the p buffer, then draw that texture onto a quad in the frame buffer. If I draw onto the p buffer in Ortho mode using glVertex2d(), everything looks good. But if I go back into normal mode and try to draw onto the p buffer with glVertex3d(), the resulting texture is empty. I know about the WGL_NV_render_depth_texture extension, but I don't think I want that because once I draw onto the p buffer, I don't have any more use for the depth. Anyone want to set me straight? ;-)
Advertisement
Some code for us? It could be a number of things.
bool pbufferInit (WORD wWidth, WORD wHeight){...................  int PixelAttr[] =  {    WGL_SUPPORT_OPENGL_ARB, TRUE,    WGL_DRAW_TO_PBUFFER_ARB, TRUE,    WGL_BIND_TO_TEXTURE_RGBA_ARB,TRUE,    WGL_RED_BITS_ARB, 8,    WGL_GREEN_BITS_ARB, 8,    WGL_BLUE_BITS_ARB, 8,    WGL_ALPHA_BITS_ARB, 8,    WGL_DEPTH_BITS_ARB, 24,    WGL_DOUBLE_BUFFER_ARB, FALSE,    0  };	  wglChoosePixelFormatARB(hDC, PixelAttr, NULL, 1, &pixelFormat, &count);	  int PBufferAttr[] =  {    WGL_TEXTURE_FORMAT_ARB, WGL_TEXTURE_RGBA_ARB,    WGL_TEXTURE_TARGET_ARB, WGL_TEXTURE_2D_ARB,    WGL_MIPMAP_TEXTURE_ARB, 0,    WGL_PBUFFER_LARGEST_ARB, 1,    0  };  hPBuffer = wglCreatePbufferARB(hDC, pixelFormat, wWidth, wHeight, PBufferAttr);  hDC_PBuffer = wglGetPbufferDCARB(hPBuffer);  hRC_PBuffer = wglCreateContext(hDC_PBuffer);  glGenTextures(1, &pbufferTexture);  glBindTexture(GL_TEXTURE_2D, pbufferTexture);  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR );  glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR );  return true;}void pbufferEnable(){  wglMakeCurrent(hDC_PBuffer, hRC_PBuffer);  glViewport(0, 0, dwBufferWidth, dwBufferHeight);}void pbufferDisable(){  RECT WindowRect;  GetWindowRect(hWnd, &WindowRect);  wglMakeCurrent(hDC, hRC);  glViewport(0, 0, WindowRect.right - WindowRect.left, WindowRect.bottom - WindowRect.top);}void pbufferBind(){  glBindTexture(GL_TEXTURE_2D, pbufferTexture);  wglBindTexImageARB(hPBuffer, WGL_FRONT_LEFT_ARB);}void pbufferRelease(){  glBindTexture(GL_TEXTURE_2D, 0);  wglReleaseTexImageARB(hPBuffer, WGL_FRONT_LEFT_ARB);}void DrawGL(){...................  pbufferEnable();  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  [Draw code here]  pbufferDisable();  glClearColor( 1.0f, 1.0f, 1.0f, 1.0f );  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  pbufferBind();  glBegin(GL_QUADS);    glTexCoord2f(0, 1); //Upper left    glVertex3d(0, 0, 500);			    glTexCoord2f(1, 1); //Upper Right    glVertex3d(500, 0, 500);    glTexCoord2f(1, 0);	//Lower Right    glVertex3d(500,  500, 500);    glTexCoord2f(0, 0);	//Lower Left    glVertex3d(0, 500, 500);  glEnd();    pbufferRelease();  SwapBuffers(hDC);}
Post the actual code you used to render to the pbuffer when you weren't using glOrtho. Some points though:
The render_depth extension is for rendering just depth(for shadowmapping)

Your pbuffer width and height should be powers of 2

You can draw to the pbuffer in any way you like, so the pbuffer being blank when you didn't use glOrtho was probably an error in your drawing code.

EDIT: I just noticed you didn't switch to ortho mode to draw the textured quad. So probably, when you did the RTT in ortho mode and then drew the quad it looked fine, but when you switched to perspective for the RTT you forgot to switch back to ortho to draw the quad.
To initialize the p-buffer, I use: pbufferInit(512, 512), so it is a power of 2.

Here's the code that's being drawn:

void DrawTemp(){  glColor3f(1,0,0);	  glBegin(GL_QUADS);    glVertex3d( 0,  0, 250); //Lower left    glVertex3d(20,  0, 250); //Lower Right    glVertex3d(20, 50, 250); //Upper Right    glVertex3d( 0, 50, 250); //Upper Left  glEnd();}



Edit: I'm not trying to draw the textured quad in ortho mode. I'm drawing it off to the side so that I can pan around and see it. But if I draw that quad in ortho mode, I get the same results: blank.
If you're not using a viewing transform, then your eye point is at the origin, looking in the opposite direction of what you're drawing. Change your positive z values to negative when you draw, or use gluLookAt to position the eyepoint.
I do use a view transform, so +z is ahead of me when the camera has no yaw. If I draw either/both of those quads in the frame buffer, they look perfect. It's only when I try to draw in the p-buffer that it messes up.
I can't find any really significant differences from my own pbuffer code so I'm at a loss. Sorry I couldn't be of help.

[Edited by - digitec devil on August 28, 2004 5:19:22 PM]
Are you doing a glClear in your PBuffer ? Maybe you're forgetting to clear the depth or something like that ?

Y.
I clear the Color and Depth bits right after I switch into the p-buffer. My code looks the same as all the examples and stuff, I just can't figure out what the problem is. :-(

If I change the color in glClearColor after switching to the p-buffer, I see that color on the textured quad, so I know I'm seeing the texture. I just don't see the quad that I'm drawing.

This topic is closed to new replies.

Advertisement