Если у вас нет довольно старой видеокарты, удивительно, что у вас нет поддержки фрагмент-шейдера. Я бы посоветовал вам попробовать перепроверить, используя this .
Кроме того, вы уверены, что хотите, чтобы максимальное значение было равно 0? Возможно, вы имели в виду 1? Если вы имели в виду 1, а не 0, то это довольно скучные способы сделать то, что вы просите.
Сокращенный ответ: вы используете несколько проходов рендеринга. Сначала вы визуализируете изображение с нормальной интенсивностью. Затем вы используете вычитающее смешивание (ищите glBlendEquation), чтобы вычесть минимальное значение. Затем вы используете аддитивное смешивание, чтобы умножить все на 1 / (max-min) (для этого может потребоваться несколько проходов).
Если вы действительно хотите это сделать, пожалуйста, отправьте обратно GL_VENDOR
и GL_RENDERER
для вашей видеокарты.
Редактировать: Хмм. У Intel 945G нет ARB_fragment_shader
, но у него есть ARB_fragment_program
, что также поможет.
Ваш фрагмент-код должен выглядеть примерно так (но с тех пор, как я его написал, прошло довольно много времени, поэтому он, вероятно, содержит ошибки)
!!ARBfp1.0
ATTRIB tex = fragment.texcoord[0]
PARAM cbias = program.local[0]
PARAM cscale = program.local[1]
OUTPUT cout = result.color
TEMP tmp
TXP tmp, tex, texture[0], 2D
SUB tmp, tmp, cbias
MUL cout, tmp, cscale
END
Вы загружаете это в OpenGL примерно так:
GLuint prog;
glEnable(GL_FRAGMENT_PROGRAM_ARB);
glGenProgramsARB(1, &prog);
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog);
glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(src), src);
glDisable(GL_FRAGMENT_PROGRAM_ARB);
Затем, перед рендерингом вашей геометрии, вы делаете это:
glEnable(GL_FRAGMENT_PROGRAM_ARB);
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog);
colour4f cbias = cmin;
colour4f cscale = 1.0f / (cmax-cmin);
glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 0, cbias.r, cbias.g, cbias.b, cbias.a);
glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 1, cscale.r, cscale.g, cscale.b, cscale.a);
//Draw your textured geometry
glDisable(GL_FRAGMENT_PROGRAM_ARB);