Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 2 of 2

Thread: GL_ADD numeric precision problem

  1. #1
    Newbie Newbie
    Join Date
    Sep 2017
    Posts
    1

    GL_ADD numeric precision problem

    Hi everyone,
    I have just approached the OpenGl world and I would have a question to ask you:
    in my project I would like to add several times the contribution of a texture; using GL_ADD or GL_ADD_SIGNED I succeeded in the intent but I encountered a numeric precision problem...
    I use GL_TEXTURE_2D textures configured as GL_RGBA32F but it seems that every subsequent increment necessarily entails a truncation of float precision to int.
    I would like to know if there is a way to handle the entire GL_ADD phase in float precision and to demand the rounding to int only one time during the video-making phase.

    Code :
    //Texture Setup
    //3x3 texture RGBA
    float* pRGBA = new float[9 * 4];
    // vector pRGBA filled with float value [0-1] R,G,B and Alpha to 1
    //...
     
    glBindTexture(GL_TEXTURE_2D, 0);
    glGenTextures(1, &m_texture);
     
    //...
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F,
    			3,
    			3,
    			0,
    			GL_RGBA, GL_FLOAT,
    			pRGBA);
    //...
    glBindTexture(GL_TEXTURE_2D, 0);

    Code :
    //Texture Draw (called multiple times)
    float ValR,ValG,ValB; //color modulation
    float X,Y; //Texture center position
    //...
    glBindTexture(GL_TEXTURE_2D, m_texture);
     
    	////////////modulate texure color//////////
    	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    	glColor4f(ValR, ValG, ValB , 1);
    	////////////////////////////////////////////
     
     
    	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     
    	//ENABLE BLEND
    	glEnable(GL_BLEND);
    		//ENABLE TEXTURE 2D MANAGEMENT
    		glEnable(GL_TEXTURE_2D);
    			glBegin(GL_QUADS);
    				glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD_SIGNED);
    					// top left
    					glTexCoord2f(0, 0);		glVertex3f(X-1.5, Y-1.5, 0);
    					// top right
    					glTexCoord2f(1, 0);		glVertex3f(X+1.5, Y-1.5, 0);
    					// bottom right
    					glTexCoord2f(1, 1);		glVertex3f(X+1.5, Y+1.5, 0);
    					// bottom left
    					glTexCoord2f(0, 1);		glVertex3f(X-1.5, Y+1.5, 0);
    			glEnd(); 
    		glDisable(GL_TEXTURE_2D ); //Fine gestione Texture 2D
    	glDisable(GL_BLEND);
    	//Release Texture
    	glBindTexture(GL_TEXTURE_2D,0);
     //..

    Thanks in advance for any suggestion

  2. #2
    Senior Member OpenGL Guru
    Join Date
    Jun 2013
    Posts
    2,522
    Quote Originally Posted by avlasx View Post
    I would like to know if there is a way to handle the entire GL_ADD phase in float precision and to demand the rounding to int only one time during the video-making phase.
    You need to use a framebuffer object (FBO) with e.g. a GL_RGBA16 or GL_RGBA32F texture for the colour buffer.

    Also, I'm wondering if you're getting confused between glTexEnv() and blending. And if you're using an OpenGL version which supports floating-point textures, you should be using shaders rather than glTexEnv().

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •