Alright, here is stumbling block #2. The constant color is clamped when set, so I can’t scale the input with a value greater than 1.
I have an input image loaded into texture memory. Here is my code that does not work:
glClientActiveTextureARB(GL_TEXTURE0_ARB);
glClientActiveTextureARB(GL_TEXTURE1_ARB);
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_3D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS_ARB);
if(bias < 0)
{
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_SUBTRACT_ARB);
float c2[] = { -bias/scale, -bias/scale, -bias/scale, 0 } ;
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, c2);
}
else
{
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD);
float c2[] = { bias/scale, bias/scale, bias/scale, 0 } ;
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, c2);
}
texture->bind();
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_3D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS_ARB);
float c1[] = { scale, scale, scale, 0 } ;
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, c1); // Is clamping occuring here?
texture->bind();
glBegin(GL_QUADS);
{
glTexCoord3i(0, 0, 0); glVertex2i(0, 0);
glTexCoord3i(1, 0, 0); glVertex2i(1, 0);
glTexCoord3i(1, 1, 0); glVertex2i(1, 1);
glTexCoord3i(0, 1, 0); glVertex2i(0, 1);
}
glEnd();
Here is my current algorithm that does work, using the framebuffer to accumulate the image “scale” number of times:
glClientActiveTextureARB(GL_TEXTURE0_ARB);
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_3D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS_ARB);
if(bias < 0)
{
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_SUBTRACT_ARB);
float c2[] = { -bias/scale, -bias/scale, -bias/scale, 0 } ;
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, c2);
}
else
{
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD);
float c2[] = { bias/scale, bias/scale, bias/scale, 0 } ;
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, c2);
}
texture->bind();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glBlendEquationEXT(GL_FUNC_ADD_EXT);
for(; scale > 0; --scale)
{
glColor4f(0, 0, 0, scale);
glBegin(GL_QUADS);
{
glTexCoord3i(0, 0, 0); glVertex2i(0, 0);
glTexCoord3i(1, 0, 0); glVertex2i(1, 0);
glTexCoord3i(1, 1, 0); glVertex2i(1, 1);
glTexCoord3i(0, 1, 0); glVertex2i(0, 1);
}
}
glEnd();
The part I am trying to get rid of is the use of the blending operations and the loop.