除非你有一个相当旧的显卡,否则你没有片段着色器支持是令人惊讶的。我建议您尝试使用this 进行仔细检查。
另外,您确定要将最大值以上的任何值设为 0 吗?也许你的意思是1?如果您的意思是 1 而不是 0,那么执行您所要求的事情的方法非常冗长。
简明扼要的答案是您使用了多个渲染通道。首先,您以正常强度渲染图像。然后你使用减法混合(查找 glBlendEquation)来减去你的最小值。然后使用加法混合将所有内容乘以 1/(max-min)(可能需要多次通过)。
如果您真的想这样做,请为您的显卡发回GL_VENDOR 和GL_RENDERER。
编辑: 嗯。英特尔 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);