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位)标志一起使用。
答
但是,如何为每个像素创建我自己的“自制图像”,即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]
);
答
如果你想指定二维纹理图像(glTexImage2D
),这是紧凑,那么你必须设置GL_UNPACK_ALIGNMENT
为1(见glPixelStore
)。
glPixelStore(GL_UNPACK_ALIGNMENT, 1);
由于使用索里格式GL_RGB
在GL_UNSIGNED_BYTE
,的3个颜色通道(红色,绿色和蓝色)和每个颜色通道被存储在一个字节中范围[0,255]每个像素consits。
如果你想在(x
,y
)像素为着色R
,G
和B
,这将是这样完成的:
texdata[(y*WIDTH+x)*3+0] = R;
texdata[(y*WIDTH+x)*3+1] = G;
texdata[(y*WIDTH+x)*3+2] = B;
我不明白,你尝试过这样做?你只需要传递一大块包含数据而不是图像数据的字节。显示如何将数据从您的图像加载器传递到GL纹理的后代码,然后尝试将自制图像数据传递到纹理,并告诉我们什么不起作用。 – zero298
我意识到你需要专门为OpenGL创建无符号的8位整数来正确解释它们作为RGB值。我真的一直在尝试这个好几天,并设法解决它,就像我决定发布这个之后的2分钟一样...... – Jackbob
Eh,'GL_UNSIGNED_INT'也是一个有效的'glTexImage2D()'''type'',你会只需将色彩通道范围从[0,2^8-1]扩展到[0,2^32-1]即可。 – genpfault