OpenGL纹理格式,为OpenGL创建图像/纹理数据
OpenGL texture format, create image/texture data for OpenGL
好的,所以我需要创建自己的纹理/图像数据,然后将其显示在OpenGL中的四边形上。我有四个工作,我可以用我自己的纹理加载程序在上面显示TGA文件,它完美地映射到四个。
但是,我如何创建自己的"自制图像",即1000x1000和每个像素的3个通道(RGB值)?纹理数组的格式是什么?例如,我如何将像素(100100)设置为黑色?
这就是我对完全白色图像/纹理的想象:
#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不能处理我使用的普通int,但它可以很好地处理uint8_t。我想这是因为我上传到GPU时使用的GL_RGB和GL_UNSIGNED_BYTE(只有8位,普通int不是8位)标志。
但是我如何创建自己的"自制图像",即1000x1000和每个像素的3个通道(RGB值)?
std::vector< unsigned char > image( 1000 * 1000 * 3 /* bytes per pixel */ );
纹理阵列的格式是什么
红色字节、绿色字节、蓝色字节。重复
例如,如何将像素(100100)设置为黑色?
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]
);
默认情况下,纹理的每一行都应该对齐到4个字节。纹理是RGB纹理,每个纹素需要24位或3个字节,并且纹理被紧密地封装,尤其是纹理的行。这意味着纹理的一行开始的4个字节的对齐被忽略(除了纹理宽度的3倍可以被4整除而没有剩余)。
为了解决这个问题,必须将对齐方式更改为1。这意味着在将紧密封装的纹理加载到GPU(glTexImage2D
)之前必须设置GL_UNPACK_ALIGNMENT
参数:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
否则,在纹理查找时,每行获得0-3字节的偏移量。这会导致纹理持续扭曲或倾斜。
由于在GL_UNSIGNED_BYTE
中使用源格式GL_RGB
,因此每个像素由3个颜色通道(红色、绿色和蓝色)组成,并且每个颜色通道存储在[0255]范围内的一个字节中。
如果您想将(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;
- 如何显示具有 opengl 纹理的灰度图像
- 无法使 opengl 纹理正常工作
- 现代OpenGL纹理金字塔
- OpenGL:纹理渲染被卡住
- 如何使用Qt多媒体和C++将.mp4视频从OpenGL纹理中保存出来
- 在某些情况下,多个 OpenGL 纹理不起作用?
- 如何将硬编码图像加载到 OpenGL 纹理中
- OpenGL 纹理会导致 ImGUI 窗口永久失焦
- 我如何将Win32窗口渲染到OpenGL纹理
- 将Pixeldata渲染到OpenGL纹理四边形中
- OpenGL纹理闪烁/有时在窗口大小上移动
- OpenGL 纹理坐标不起作用
- OpenGL 纹理状态使用警告:
- OpenGL纹理未显示
- OpenGL纹理不呈现
- 获取 OpenGL 纹理中特定像素的颜色
- C++ / OpenGL:纹理到像素图示例 - 缩小转换误差
- OpenGl 纹理拉扯
- OpenGL纹理格式,为OpenGL创建图像/纹理数据
- 创建原始OpenGL纹理数据(C++)