【问题标题】:Color mapping a texture in opengl在opengl中对纹理进行颜色映射
【发布时间】:2010-09-19 01:25:06
【问题描述】:

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

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

然后我尝试使用 glPixelTransfer 来设置比例和偏差'。这似乎在第一次通过时产生了某种效果(不一定是所需的),但是当改变上限和下限约束时,看不到任何效果。

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

所以现在我很茫然。我该怎么办?请帮忙。


任何可行的方法我都愿意尝试。供应商是英特尔,渲染器是英特尔 945G。不幸的是,我仅限于集成在主板上的显卡,并且只有 gl 1.4。

感谢您迄今为止的回复。

【问题讨论】:

    标签: opengl colors mapping textures


    【解决方案1】:

    除非你有一个相当旧的显卡,否则你没有片段着色器支持是令人惊讶的。我建议您尝试使用this 进行仔细检查。

    另外,您确定要将最大值以上的任何值设为 0 吗?也许你的意思是1?如果您的意思是 1 而不是 0,那么执行您所要求的事情的方法非常冗长。

    简明扼要的答案是您使用了多个渲染通道。首先,您以正常强度渲染图像。然后你使用减法混合(查找 glBlendEquation)来减去你的最小值。然后使用加法混合将所有内容乘以 1/(max-min)(可能需要多次通过)。

    如果您真的想这样做,请为您的显卡发回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);
    

    【讨论】:

      【解决方案2】:

      还可以查看是否支持 GL_ARB_fragment_program 扩展。该扩展支持 ASM 风格的片段程序。这应该在 OpenGL 1.4 中得到支持。

      【讨论】:

      • 支持GL_ARB_fragment_program。
      【解决方案3】:

      很遗憾,您使用的是如此古老的 OpenGL 版本。你可以用你的卡升级吗?

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

      OpenGL Documentation

      OpenGL Shading Langauge

      【讨论】:

      • 如果他说他被限制为 1.4,他被限制为 1.4。用他不能拥有的东西诱惑他简直是卑鄙的。
      猜你喜欢
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 2011-05-04
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 2014-10-22
      相关资源
      最近更新 更多