除非你有一個漂亮的舊圖形卡,這是令人驚訝的,你沒有片段着色支持。我建議你嘗試使用this進行雙重檢查。
此外,你確定你想要最大值以上的任何東西都是0嗎?也許你的意思是1?如果你的意思是1而不是0,那麼你就會用很囉嗦的方式去做你正在問的東西。
精簡的答案是您使用多個渲染通道。首先你以正常的強度渲染圖像。然後使用減法混合(查找glBlendEquation)來減去最小值。然後你使用添加劑混合將所有東西乘以1 /(最大 - 最小)(可能需要多次通過)。
如果你真的想這樣做,請將你的圖形卡的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);
GL_ARB_fragment_program支持。 – 2008-10-25 00:10:00