pbuffer questions
I've been trying to get pbuffering working, but I'm running into many problems, and I have a few questions.
I'm implementing a cg raytracer and I need 128-bit textures and pbuffer. I quickly realized that I had to call wglShareLists() to be able to use textures in the pbuffer and regular context. Then I read that if I share contexts, the pixelformat for each must be the same. That means I can't get 128-bit pbuffer, since it must be the same as the frame buffer. Therefore I must create all my 128-bit textures while the pbuffer is the current context, and not use wglShareLists() and I will be limited to only using those textures in the pbuffer. Am I understanding this correctly?
After I render something to be pbuffer, I want to store the result in a texture. I know I can bind the pbuffer as a texture and draw with that, but does it actually copy the data from the pbuffer to the texture, or just use the pbuffer data as the texture data? I need to copy the data to a texture, I'm currently using glCopyTexImage2D(). Will this work correctly? My images are GL_TEXTURE_RECTANGLE_NV:GL_FLOAT_RGB(A)32_NV. I assume it does work, but I'm getting all black textures.
I haven't found solid answers to these questions anywhere. If anyone could shed some light on these questions, I'd appreciate it.
You can use these files taken straight from my own Scenegraph :)
http://www.realityflux.com/abba/C++/Sample/
PS: in my scenegraph, I have a class called GLTexture which can be associated with a PBuffer to avoid an expensive glCopy.
http://www.realityflux.com/abba/C++/Sample/
pixelBuffer.initialize(TCMSize,TCMSize, 24, 0, PBUFFER_RGBA | PBUFFER_FORMAT_FLOAT | PER_CHANNEL_COLOR_BITS_32 | PBUFFER_RENDER_TO_TEXTURE);
PS: in my scenegraph, I have a class called GLTexture which can be associated with a PBuffer to avoid an expensive glCopy.
void GLTexture::bindAttributes(){ if(!TexturesManager::bindTexture(textureIndex)) { if(textureID > 0) { glEnable(textureType); glBindTexture(textureType, textureID); } else { return; } } if(pBuffer) { wglBindTexImageARB(pBuffer->getPBufferHandle(), WGL_FRONT_LEFT_ARB); } doTransform(); snip...}
void GLTexture::associateWithPBuffer(GLPBuffer *buffer){ pBuffer = buffer;}
Thanks for the link.
In your pbuffer code, you use wglShareLists(). Does that mean the pbuffer can only have the same pixelformat as the framebuffer? You couldn't get a full 128-bit pbuffer that way, can you?
In your pbuffer code, you use wglShareLists(). Does that mean the pbuffer can only have the same pixelformat as the framebuffer? You couldn't get a full 128-bit pbuffer that way, can you?
Dude, wglShareLists allows the sharing of Texture/VBO/Shaders object, I don't think it's got anything to do with the pixel format itself now does it...
I guess not. That's one of that questions I asked above. I wasn't sure because I've read a couple of conflicting posts.
I've got a 128b pbuffer, and 128b texture. I draw to the pbuffer, then copy the data via glCopyTexImage2D() (yes I know it's slow, but I'm just trying to get things working before I speed it up). The resulting texture only has 32b presicion. This is where I'm stuck/confused. any ideas why it is doing this?
I've got a 128b pbuffer, and 128b texture. I draw to the pbuffer, then copy the data via glCopyTexImage2D() (yes I know it's slow, but I'm just trying to get things working before I speed it up). The resulting texture only has 32b presicion. This is where I'm stuck/confused. any ideas why it is doing this?
pixelBuffer.initialize(texWidth, texHeight, 24, 0, PBUFFER_RGBA | PBUFFER_FORMAT_FLOAT | PER_CHANNEL_COLOR_BITS_32 | PBUFFER_TEXTURE_CUBE_MAP | PBUFFER_RENDER_TO_TEXTURE); texture128B.setID(TextureLoader::loadEmptyTexture2D(texWidth, texHeight, GL_FLOAT, GL_RGBA_FLOAT32_ATI));
static int loadEmptyTexture2D(GLint width = 128, GLint height = 128, GLint type = GL_UNSIGNED_BYTE, GLint inFormat = GL_RGBA8, GLint format = GL_RGBA, GLint clampS = GL_REPEAT, GLint clampT = GL_REPEAT, GLint magFilter = GL_LINEAR, GLint minFilter = GL_LINEAR){ Logger::writeLogDataList("<+>Loading Empty Texture2D: Width %d, Height %d.\n", width, height); GLuint textureId; glGenTextures(1, &textureId); glBindTexture(GL_TEXTURE_2D, textureId); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, clampS); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, clampT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter); glTexImage2D(GL_TEXTURE_2D, 0, inFormat, width, height, 0, format, type, NULL); return textureId; }
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement