在opengl中映射纹理的颜色

时间:2008-10-24 16:47:00

标签: opengl colors mapping textures

我正在显示一个我想要操作的纹理,而不会影响图像数据。我希望能够钳制纹素值,使低于下限值的任何值变为0,高于上限值的任何值变为0,并且之间的任何值都从0到1线性映射。

最初,要显示我的图像,我使用的是glDrawPixels。为了解决上面的问题,我将使用glPixelMap创建一个颜色贴图。这非常有效。但是,出于性能原因,我已经开始使用纹理来显示我的图像。 glPixelMap方法似乎不再起作用。那个方法可能有用,但我无法让它工作。

然后我尝试使用glPixelTransfer设置比例和偏差'。这似乎在第一次通过时会产生某种影响(不一定是所需的),但是当上下约束发生变化时,没有任何效果可见。

然后告诉我片段着色器会起作用。但是在调用glGetString(GL_EXTENSIONS)之后,我发现不支持GL_ARB_fragment_shader。另外,对glCreateShaderObjectARB的调用会导致nullreferenceexception。

所以现在我不知所措。我该怎么办?请帮助。


我愿意尝试什么工作。供应商是英特尔,渲染器是英特尔945G。不幸的是,我被限制在主板上集成的显卡上,只有gl 1.4。

感谢您迄今为止的回复。

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

另请参阅是否支持GL_ARB_fragment_program扩展程序。该扩展支持ASM样式的片段程序。这应该在OpenGL 1.4中得到支持。

答案 2 :(得分:-1)

您使用如此古老的OpenGL版本真的很不幸。你可以用你的卡升级吗?

对于更现代的OGL 2.x,这正是GLSL的用途。很棒的文档可以在这里找到:

OpenGL Documentation

OpenGL Shading Langauge