Store world positions in a texture

Started by
6 comments, last by sveinn 14 years, 10 months ago
Does anyone know how to store world positions ( a 3d vector of integer values where each coordinate is in the range say [-300,300] ) in a texture instead of color values. Specifically, I would output the position of each fragment in the fragment shader instead of its color, then store that in a texture. It seems like the storage format of textures (according to glTexImage2D description) is always clamped to the range [0,1]. Do I perhaps need some fancy extension to implement this? Thanks for your time, -Sveinn
Advertisement
To store 16 or 32-bit floats in a texture, you need the float texture extension. Check for ATI_texture_float, ARB_texture_float, or the NVidia equivalent.
I'll check that out, thanks.

I've been trying to use GL_RGBA32F_ARB (from the ARB_texture_float
extension) but unfortunately the results are still clamped to [0,1]. Specifically this is how I create my texture:


glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGBA32F_ARB, texture_width, texture_height, 0, GL_RGBA, GL_FLOAT, pixels)


Then I render everything using shaders, for testing I set the output color in my fragment shader to float4(0.1234, 2.0, 3.0, 4.0). When I look at the output in my texture using:


glGetTexImage( GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT, pixels )


I get (0.1234, 1.0, 1.0, 1.0), which is a kick in the balls.

When searching for similar issues I found suggestions to use the following function calls, which are supposed to disable color clamping ( it's from the ARB_color_buffer_float extension ):

glClampColorARB(GL_CLAMP_VERTEX_COLOR_ARB, GL_FALSE);
glClampColorARB(GL_CLAMP_READ_COLOR_ARB, GL_FALSE);
glClampColorARB(GL_CLAMP_FRAGMENT_COLOR_ARB, GL_FALSE);

Tried those out, no luck, everything clamped tight..

I should mention that I'm on a Mac (9600M GT) and some Mac people (8600 by the looks of it) say that they couldn't use the glClampColorARB. However everything did compile and run without errors so I assume the extension is supported on my platform/hardware, not sure though..


Any ideas on how this can be solved?
Haven't used this extension before so not really :) I would check for the extension string to make sure - just compiling doesn't guarantee anything, and it may be giving you a lower-grade texture at run-time if float is not available. Based on your description, I take it you are rendering to a texture attached to a FBO?
Ok.

Actually, I am just copying from the back-buffer into a texture. I am gonna try out FBOs now ( total newbie here :)
Quote:Original post by sveinn
I've been trying to use GL_RGBA32F_ARB (from the ARB_texture_float
extension) but unfortunately the results are still clamped to [0,1]. Specifically this is how I create my texture:

glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGBA32F_ARB, texture_width, texture_height, 0, GL_RGBA, GL_FLOAT, pixels)

Then I render everything using shaders, for testing I set the output color in my fragment shader to float4(0.1234, 2.0, 3.0, 4.0). When I look at the output in my texture using:

glGetTexImage( GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT, pixels )

I get (0.1234, 1.0, 1.0, 1.0), which is a kick in the balls.
Try checking that you do indeed receive a float texture (OpenGL is free to fall back to 8-bit textures if it can't support floating point textures):
nformat = GLint()glGetTexLevelParameteriv(target, 0, GL_TEXTURE_INTERNAL_FORMAT, byref(nformat))if nformat.value != internal_format:	print 'requested format not available, falling back to: %s' % (nformat.value)

Quote:When searching for similar issues I found suggestions to use the following function calls, which are supposed to disable color clamping ( it's from the ARB_color_buffer_float extension ):

glClampColorARB(GL_CLAMP_VERTEX_COLOR_ARB, GL_FALSE);
glClampColorARB(GL_CLAMP_READ_COLOR_ARB, GL_FALSE);
glClampColorARB(GL_CLAMP_FRAGMENT_COLOR_ARB, GL_FALSE);

Tried those out, no luck, everything clamped tight..

I should mention that I'm on a Mac (9600M GT) and some Mac people (8600 by the looks of it) say that they couldn't use the glClampColorARB. However everything did compile and run without errors so I assume the extension is supported on my platform/hardware, not sure though.
glClampColorARB only affects vertex colours, not textures.
Quote:Actually, I am just copying from the back-buffer into a texture. I am gonna try out FBOs now ( total newbie here :)
Ah, this will be your problem. The backbuffer is always clamped, no matter what format it is in. You need to render directly to your texture, using an FBO.

Tristam MacDonald. Ex-BigTech Software Engineer. Future farmer. [https://trist.am]

Beautiful! That's exactly the problem. Render directly to texture using FBO works like a charm :D

Finally I can go to bed.. thanks for your help guys!


[EDIT:
Since I am a newbie this came in handy, FBO intro:
http://www.gamedev.net/reference/programming/features/fbo1/default.asp

As well as:
http://www.songho.ca/opengl/gl_fbo.html
]

This topic is closed to new replies.

Advertisement