好的,我需要创建自己的纹理/图像数据,然后将其显示在OpenGL中的四边形上。我有四边形工作,我可以用我自己的纹理加载器在它上面显示一个TGA文件,它完美地映射到四边形。
但是如何为每个像素创建自己的"自制图像",即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 :(得分:4)
但是如何为每个像素创建自己的&#34;自制图像&#34;,即1000x1000和3个通道(RGB值)?
PyQt5-5.6-gpl-Py3.5-Qt5.6.0-x64-2.exe
纹理数组的格式是什么
红色字节,然后是绿色字节,然后是蓝色字节。重复。
我如何将像素(100,100)设置为黑色?
std::vector< unsigned char > image( 1000 * 1000 * 3 /* bytes per pixel */ );
上传途径:
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
答案 1 :(得分:2)
默认情况下,纹理的每一行应与4个字节对齐。 纹理是RGB纹理,每个纹素需要24位或3个字节,纹理紧密包装,尤其是纹理行。 这意味着忽略了纹理线开始的4个字节的对齐(除了纹理宽度的3倍可以被4整除而没有剩余)。
要解决这个问题,必须将对齐方式更改为1。
这意味着在将紧密压缩的纹理加载到GPU(GL_UNPACK_ALIGNMENT
)之前必须设置glTexImage2D
参数:
INCLUDEPATH
否则,在纹理查找时,每行的偏移量为0-3个字节。这会导致连续扭曲或倾斜的纹理。
由于您在glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
中使用了源格式GL_RGB
,因此每个像素由3个颜色通道(红色,绿色和蓝色)组成,每个颜色通道存储在范围[0,255]中的一个字节中]
如果您想将(GL_UNSIGNED_BYTE
,x
)的像素设置为颜色y
,R
和G
,则可以像这样:
B