OpenGL亮度到颜色映射?

时间:2013-06-14 01:53:14

标签: c++ opengl opengl-3

我想知道是否有办法处理OpenGL纹理缓冲区,以便通过我选择的某个公式将灰度值缓冲区转换为rgb值。

我已经有一个类似的功能,效果很好,但输出一个颜色3矢量。

rgb convertToColor(float value);

我是OpenGL的新手,想知道我应该使用什么样的着色器以及它应该去哪里。我的程序目前循环帧:

program1.bind();
program1.setUniformValue("texture", 0);
program1.enableAttributeArray(vertexAttr1);
program1.enableAttributeArray(vertexTexr1);
program1.setAttributeArray(vertexAttr1, vertices.constData());
program1.setAttributeArray(vertexTexr1, texCoords.constData());
glBindTexture(GL_TEXTURE_2D, textures[0]);
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,widthGL,heightGL, GL_LUMINANCE,GL_UNSIGNED_BYTE, &displayBuff[displayStart]);
glDrawArrays(GL_TRIANGLES, 0, vertices.size());
glBindTexture(GL_TEXTURE_2D,0);
//...

着色

QGLShader *fshader1 = new QGLShader(QGLShader::Fragment, this);
    const char *fsrc1 =
        "uniform sampler2D texture;\n"
        "varying mediump vec4 texc;\n"
        "void main(void)\n"
        "{\n"
        "    gl_FragColor = texture2D(texture, texc.st);\n"
        "}\n";

我正在尝试在matlab中重新创建效果,例如imagesc,如下图所示: imagesc

2 个答案:

答案 0 :(得分:6)

这样的事情会起作用:

    "uniform sampler2D texture;\n"
    "uniform sampler1D mappingTexture;\n"
    "varying mediump vec4 texc;\n"
    "void main(void)\n"
    "{\n"
    "    gl_FragColor = texture1D(mappingTexture, texture2D(texture, texc.st).s);\n"
    "}\n";

其中映射纹理是将灰度映射到颜色的1D文本。

当然,你也可以编写基于灰度计算rgb颜色的函数,但是(取决于你的硬件),进行纹理查找可能会更快。

  

目前尚不清楚如何将两个缓冲区一次绑定到OpenGL程序

Binding textures to samplers.

答案 1 :(得分:1)

看起来您已经加载了一个程序并设置为读取纹理(代码中的program1)。假设顶点着色器已设置为传递像素着色器纹理坐标以查找纹理(在下面的程序中这是“texcoord”),您应该能够将像素着色器更改为以下内容:

uniform texture2d texture;   // this is the greyscale texture
varying vec2 texcoord;       // passed from your vertex shader

void main() 
{  
    float luminance = tex2D(texture, texcoord).r;     // grab luminance texture
    gl_FragColor = convertToColor(luminance);         // run your function
}

这会读取亮度纹理并调用将亮度转换为颜色的函数。如果您的函数只返回3分量rgb向量,则可以将最后一行更改为:

gl_FragColor = vec4(convertToColor(luminance), 1.0);