使用glGetTexImage()进行像素访问?

时间:2018-02-22 23:30:29

标签: c++ opengl textures sdl-2

我遇到了OpenGL和glGetTexImage()的问题。

我想获得之前我创建的纹理的像素 像这样的代码:

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D,
    0, 
    GL_RGBA, 
    width,
    height,
    0, 
    GL_RGB, 
    GL_UNSIGNED_BYTE, 
    someRandomPixels);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

我正在使用SDL2。

在我加载纹理后,我试图获得此纹理的像素 在GLuint *像素指针中,我声明如下:

GLuint* pixels = new GLuint[256*256*4];

此图片的尺寸为256x256像素。

我使用

获取了像素数据
GLuint* Textur::getPixelsOfTextur(GLuint textur, int width, int height, int numChannels)
{
    GLuint* pixels=new GLuint[width*height*numChannels];
    glBindTexture(GL_TEXTURE_2D, textur);
    glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_INT, pixels);
     return pixels;
}

其中" numChannels" RGBA为4,RGB为3

现在我的问题是我真的不知道如何正确处理Pixel p(x,y),因为我的数组大小是像素数的4倍,每次我使用较小尺寸的视觉工作室抛出一个错误:

Exception thrown at 0x5ED71FCE (opengl32.dll) in sdl_opengl_Frameworktest.exe: 0xC0000005: Access violation writing location 0x09C33000.

此外,是否可以在2D阵列中获取这些数据?

1 个答案:

答案 0 :(得分:1)

以字节为单位的数组大小为1048576字节(256 * 256 * 4 * sizeof(GLuint))。这是因为单个像素的每个颜色通道都存储在单独的GLuint中,大小为4个字节(sizeof(GLuint) == 4)。因此每个像素的大小为16个字节,因为每个像素有4个颜色通道,每个颜色通道有sizeof(GLuint)个。

将每种颜色存储在GLubyte中就足够了。那么数组的大小将是262144字节(256 * 256 * 4 * sizeof(GLubyte)

GLubyte* pixels = new GLubyte[256*256*4];

glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

无论您使用GLuint还是GLubyte,都可以像这样访问单个像素的颜色:

GLuint r, g, b, a; // or GLubyte r, g, b, a;

size_t x, y; // line and column of the pixel

size_t elmes_per_line = 256 * 4; // elements per line = 256 * "RGBA"

size_t row = y * elmes_per_line;
size_t col = x * 4;

r = pixels[row + col]; 
g = pixels[row + col + 1]; 
b = pixels[row + col + 2]; 
a = pixels[row + col + 3]; 


如果您想根据rgb值计算灰度值,则可以这样:

GLubyte gray = (GLubyte)((r + g + b) / 3.0);

另一个受欢迎的公式可以在Luma找到:

GLubyte gray = (GLubyte)(r*0.2126 + g*0.7152 + b*0.0722);

用灰度替换RGB颜色通道:

pixels[row + col]     = gray; 
pixels[row + col + 1] = gray; 
pixels[row + col + 2] = gray;