OpenGL纹理格式,为OpenGL创建图像/纹理数据

问题描述:

好吧,我需要创建自己的纹理/图像数据,然后将其显示到OpenGL中的四边形上。我有四工作,我可以用我自己的纹理加载器将TGA文件显示在它上面,并且它完美地映射到四边形。OpenGL纹理格式,为OpenGL创建图像/纹理数据

但是,如何为每个像素创建自己的“自制图像”,即1000x1000和3个通道(RGB值)?纹理数组的格式是什么,例如我如何将像素(100,100)设置为黑色?

这是我怎么会想象它为全白图像/纹理:

#DEFINE SCREEN_WIDTH 1000 
#DEFINE SCREEN_HEIGHT 1000 

unsigned int* texdata = new unsigned int[SCREEN_HEIGHT * SCREEN_WIDTH * 3]; 
for(int i=0; i<SCREEN_HEIGHT * SCREEN_WIDTH * 3; i++) 
     texdata[i] = 255; 

GLuint t = 0; 
glEnable(GL_TEXTURE_2D); 
glGenTextures(1, &t); 
glBindTexture(GL_TEXTURE_2D, t); 

// Set parameters to determine how the texture is resized 
glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR_MIPMAP_LINEAR); 
glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR); 
// Set parameters to determine how the texture wraps at edges 
glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_WRAP_S , GL_REPEAT); 
glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_WRAP_T , GL_REPEAT); 
// Read the texture data from file and upload it to the GPU 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 
      GL_RGB, GL_UNSIGNED_BYTE, texdata); 
glGenerateMipmap(GL_TEXTURE_2D); 

编辑:下面的答案是正确的,但我也发现,OpenGL的不处理,我用正常的整数,但它的工作原理罚款与uint8_t。我认为这是因为GL_RGB与我上传到GPU时使用的GL_UNSIGNED_BYTE(只有8位,正常的int不是8位)标志一起使用。

+0

我不明白,你尝试过这样做?你只需要传递一大块包含数据而不是图像数据的字节。显示如何将数据从您的图像加载器传递到GL纹理的后代码,然后尝试将自制图像数据传递到纹理,并告诉我们什么不起作用。 – zero298

+0

我意识到你需要专门为OpenGL创建无符号的8位整数来正确解释它们作为RGB值。我真的一直在尝试这个好几天,并设法解决它,就像我决定发布这个之后的2分钟一样...... – Jackbob

+0

Eh,'GL_UNSIGNED_INT'也是一个有效的'glTexImage2D()'''type'',你会只需将色彩通道范围从[0,2^8-1]扩展到[0,2^32-1]即可。 – genpfault

但是,如何为每个像素创建我自己的“自制图像”,即1000x1000和3个通道(RGB值)?

std::vector< unsigned char > image(1000 * 1000 * 3 /* bytes per pixel */); 

什么是纹理数组

红字节,那么绿色字节,然后蓝色字节的格式。重复。

我如何将像素(100,100)设置为黑色?

unsigned int width = 1000; 
unsigned int x = 100; 
unsigned int y = 100; 
unsigned int location = (x + (y * width)) * 3; 
image[ location + 0 ] = 0; // R 
image[ location + 1 ] = 0; // G 
image[ location + 2 ] = 0; // B 

上传通过:

// the rows in the image array don't have any padding 
// so set GL_UNPACK_ALIGNMENT to 1 (instead of the default of 4) 
// https://www.khronos.org/opengl/wiki/Pixel_Transfer#Pixel_layout 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glTexImage2D 
    (
    GL_TEXTURE_2D, 0, 
    GL_RGB, 1000, 1000, 0, 
    GL_RGB, GL_UNSIGNED_BYTE, &image[0] 
    ); 
+0

@lisyarus:Doh!感谢您的修复:) – genpfault

+0

不客气!我也觉得,解释解包对齐的事情会很好。 – lisyarus

+0

谢谢!经过几天的努力,我设法解决了这个问题。看来我不能使用普通的无符号整数,而是使用uint8_t来创建8位,因为OpenGL似乎不熟悉变量太大以及如何处理它们。 – Jackbob

如果你想指定二维纹理图像(glTexImage2D),这是紧凑,那么你必须设置GL_UNPACK_ALIGNMENT为1(见glPixelStore )。

glPixelStore(GL_UNPACK_ALIGNMENT, 1); 

由于使用索里格式GL_RGBGL_UNSIGNED_BYTE,的3个颜色通道(红色,绿色和蓝色)和每个颜色通道被存储在一个字节中范围[0,255]每个像素consits。

如果你想在(xy)像素为着色RGB,这将是这样完成的:

texdata[(y*WIDTH+x)*3+0] = R; 
texdata[(y*WIDTH+x)*3+1] = G; 
texdata[(y*WIDTH+x)*3+2] = B;