将灰度OpenCV图像传递到OpenGL纹理



我想在GLSL着色器中使用OpenCV生成的灰度图像。

基于OpenGL纹理的OpenCV图像加载问题,我已经设法提出了将RGB图像传递给着色器的代码:

cv::Mat image; 
// ...acquire and process image somehow...
//create and bind a GL texture
glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D,     // Type of texture
    0,                 // Pyramid level (for mip-mapping) - 0 is the top level
    GL_RGB, // Internal colour format to convert to
    image.cols, image.rows, // texture size
    0,                 // Border width in pixels (can either be 1 or 0)
    GL_BGR, // Input image format (i.e. GL_RGB, GL_RGBA, GL_BGR etc.)
    GL_UNSIGNED_BYTE,  // Image data type
    image.ptr());        // The actual image data itself
glGenerateMipmap(GL_TEXTURE_2D);

然后在片段着色器中我使用这个纹理:

#version 330
in vec2 tCoord;
uniform sampler2D texture;
out vec4 color;
void main() {
    color = texture2D(texture, tCoord);
}

,这一切都很好。

但是现在我想对该图像做一些灰度处理,从cv::cvtColor(image, image, CV_BGR2GRAY);开始,对它做一些更多的OpenCV东西,然后将灰度传递给着色器。

我想我应该使用GL_LUMINOSITY作为转换的颜色格式,并且可能作为输入图像格式-但我得到的只是一个黑屏。

谁能帮我一下吗?

输入格式

我将使用GL_RED,因为GL_LUMINANCE格式已被弃用

internalFormat

取决于你想在你的着色器中做什么,尽管你应该总是指定一个大小的内部格式,例如GL_RGBA8,它给你每个通道8位。虽然,对于GL_RGBA8,绿色、蓝色和alpha通道无论如何都将为零,因为您的输入数据只有一个通道,所以您可能应该使用GL_R8格式。此外,您可以使用纹理搅拌:

GLint swizzleMask[] = {GL_RED, GL_RED, GL_RED, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);

当你在着色器中访问纹理时,将导致所有通道"镜像"红色通道。

相关内容

  • 没有找到相关文章

最新更新