opengl中纹理的颜色映射

opengl中纹理的颜色映射,opengl,colors,mapping,textures,Opengl,Colors,Mapping,Textures,我正在显示一个纹理,我想在不影响图像数据的情况下对其进行操作。我希望能够钳制texel值,以便低于下限值的任何值都变为0,高于上限值的任何值都变为0,介于两者之间的任何值都从0线性映射到1 最初,为了显示我的图像,我使用了glDrawPixels。为了解决上述问题,我将使用glPixelMap创建一个颜色贴图。这工作做得很好。然而,出于性能原因,我已经开始使用纹理来显示我的图像。glPixelMap方法似乎不再有效。好吧,这种方法可能有效,但我无法让它工作 然后我尝试使用glPixelTrans

我正在显示一个纹理,我想在不影响图像数据的情况下对其进行操作。我希望能够钳制texel值,以便低于下限值的任何值都变为0,高于上限值的任何值都变为0,介于两者之间的任何值都从0线性映射到1

最初,为了显示我的图像,我使用了glDrawPixels。为了解决上述问题,我将使用glPixelMap创建一个颜色贴图。这工作做得很好。然而,出于性能原因,我已经开始使用纹理来显示我的图像。glPixelMap方法似乎不再有效。好吧,这种方法可能有效,但我无法让它工作

然后我尝试使用glPixelTransfer设置比例和偏差。这似乎对第一次通过有某种影响(不一定是期望的),但当上下约束发生变化时,效果不明显

然后我被告知碎片着色器可以工作。但是在调用glGetString(GL_扩展)之后,我发现GL_ARB_fragment_着色器不受支持。另外,调用glCreateShaderObjectARB会导致nullreferenceexception

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


我愿意尝试任何可能奏效的方法。供应商为Intel,渲染器为Intel 945G。不幸的是,我只能使用集成在主板上的图形卡,并且只有gl 1.4


感谢您迄今为止的回复。

除非您有非常旧的图形卡,否则您没有碎片着色器支持是令人惊讶的。我建议你试着用电脑仔细检查一下

此外,是否确实希望高于最大值的任何值都为0?也许你是说1?如果你的意思是1而不是0,那么做你所要求的事情是相当冗长的

简明的答案是使用多个渲染过程。首先,以正常强度渲染图像。然后使用减法混合(查找glBlendEquation)减去最小值。然后使用加法混合将所有内容乘以1/(最大最小值)(可能需要多次传递)

如果您确实想这样做,请发回图形卡的
GL\u供应商
GL\u渲染器

编辑:嗯。英特尔945G没有
ARB\u fragment\u着色器
,但它确实有
ARB\u fragment\u程序
,该程序也会起作用

您的片段代码应该是这样的(但我已经有一段时间没有编写任何代码了,所以可能有错误)

您可以这样将其加载到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\u ARB\u fragment\u程序
扩展。该扩展支持ASM样式的片段程序。这应该在OpenGL 1.4中得到支持

很不幸,您使用的是如此古老的OpenGL版本。你能用你的卡升级吗

对于更现代的OGL2.x来说,这正是GLSL所适用的程序类型。在这里可以找到大量文档:


GL\u ARB\u fragment\u程序受支持。如果他说他限制在1.4,他就限制在1.4。用他不能拥有的东西来引诱他,这显然是卑鄙的。
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);