2008-10-24 173 views
2

我正在顯示一個我想操作的紋理,而不會影響圖像數據。我希望能夠限制紋理值,以便低於下限值的任何值變爲0,高於上限值的任何值變爲0,並且之間的任何值都從0線性映射到1.顏色在opengl中映射紋理

最初,要顯示我的圖像I正在使用glDrawPixels。爲了解決上述問題,我將使用glPixelMap創建一個彩色地圖。這工作很好。但是,出於性能原因,我已經開始使用紋理來顯示圖像。 glPixelMap方法似乎不再起作用。那麼這種方法可能會工作,但我無法得到它的工作。

然後我嘗試使用glPixelTransfer來設置比例和偏差。這在第一遍時似乎具有某種效果(不一定是期望的),但是當上限和下限被改變時,沒有效果可見。

我被告知片段着色器可以工作。但在調用glGetString(GL_EXTENSIONS)後,我發現GL_ARB_fragment_shader不受支持。另外,調用glCreateShaderObjectARB會導致nullreferenceexception。

所以現在我很茫然。我該怎麼辦?請幫忙。


什麼可能工作我願意嘗試。供應商是英特爾,渲染器是英特爾945G。不幸的是我被限制在集成在主板上的顯卡上,只有gl 1.4。

感謝您的回覆。

回答

2

除非你有一個漂亮的舊圖形卡,這是令人驚訝的,你沒有片段着色支持。我建議你嘗試使用this進行雙重檢查。

此外,你確定你想要最大值以上的任何東西都是0嗎?也許你的意思是1?如果你的意思是1而不是0,那麼你就會用很囉嗦的方式去做你正在問的東西。

精簡的答案是您使用多個渲染通道。首先你以正常的強度渲染圖像。然後使用減法混合(查找glBlendEquation)來減去最小值。然後你使用添加劑混合將所有東西乘以1 /(最大 - 最小)(可能需要多次通過)。

如果你真的想這樣做,請將你的圖形卡的GL_VENDORGL_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); 
0

另請參閱支持擴展。該擴展支持ASM風格的片段程序。這應該在OpenGL 1.4中得到支持。

+0

GL_ARB_fragment_program支持。 – 2008-10-25 00:10:00

-1

真的很不幸,你使用的是OpenGL的古老版本。你可以用你的卡升級嗎?

對於更現代的OGL 2.x,這正是GLSL所用的程序。大文檔可以在這裏找到:

OpenGL Documentation

OpenGL Shading Langauge

+1

如果他說他只限於1.4,他只限於1.4。用他不能擁有的東西來誘惑他,這只是普通的意思。 – mmr 2008-12-09 01:22:57