Str*_*her 5 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);
Run Code Online (Sandbox Code Playgroud)
我正在使用 SDL2。
加载该纹理后,我尝试在 GLuint* 像素指针中获取该纹理的像素,我声明如下:
GLuint* pixels = new GLuint[256*256*4];
Run Code Online (Sandbox Code Playgroud)
此图像的大小为 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;
}
Run Code Online (Sandbox Code Playgroud)
其中“numChannels”对于 RGBA 为 4,对于 RGB 为 3
现在我的问题是我真的不知道如何正确处理 Pixel p(x,y) 因为我的数组的大小是像素数的 4 倍,每次我使用较小尺寸的 Visual Studios 都会抛出一个错误:
Exception thrown at 0x5ED71FCE (opengl32.dll) in sdl_opengl_Frameworktest.exe: 0xC0000005: Access violation writing location 0x09C33000.
Run Code Online (Sandbox Code Playgroud)
另外,是否可以在二维数组中获取这些数据?
以字节为单位的数组大小为 1048576 字节 ( 256 * 256 * 4 * sizeof(GLuint))。这是因为单个像素的每个颜色通道都单独存储,GLuint大小为 4 个字节 ( sizeof(GLuint) == 4)。因此每个像素的大小为 16 字节,因为每个像素和sizeof(GLuint)每个颜色通道有 4 个颜色通道。
可能将每种颜色存储在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);
Run Code Online (Sandbox Code Playgroud)
无论您是否使用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];
Run Code Online (Sandbox Code Playgroud)
如果要从r, g,b值计算灰度值,则可以这样做:
GLubyte gray = (GLubyte)((r + g + b) / 3.0);
Run Code Online (Sandbox Code Playgroud)
另一个流行的公式可以在Luma找到:
GLubyte gray = (GLubyte)(r*0.2126 + g*0.7152 + b*0.0722);
Run Code Online (Sandbox Code Playgroud)
用灰度替换颜色 RGB 通道:
pixels[row + col] = gray;
pixels[row + col + 1] = gray;
pixels[row + col + 2] = gray;
Run Code Online (Sandbox Code Playgroud)