2008-10-24 179 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