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

C++ OpenGL纹理格式,为OpenGL创建图像/纹理数据,c++,opengl,glew,texture-mapping,C++,Opengl,Glew,Texture Mapping,好的,所以我需要创建自己的纹理/图像数据,然后在OpenGL中显示到一个四边形上。我有四个工作,我可以显示一个TGA文件到它与我自己的纹理加载器,它映射到四完美 但我如何创建自己的“自制图像”,即每像素1000×1000和3个通道(RGB值)?纹理数组的格式是什么,例如如何将像素(100100)设置为黑色 对于完全白色的图像/纹理,我会这样想象: #DEFINE SCREEN_WIDTH 1000 #DEFINE SCREEN_HEIGHT 1000 unsigned int* texdata

好的,所以我需要创建自己的纹理/图像数据,然后在OpenGL中显示到一个四边形上。我有四个工作,我可以显示一个TGA文件到它与我自己的纹理加载器,它映射到四完美

但我如何创建自己的“自制图像”,即每像素1000×1000和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);
#定义屏幕宽度1000
#定义屏幕高度1000
unsigned int*texdata=新的unsigned int[屏幕高度*屏幕宽度*3];
对于(int i=0;i
但我如何创建自己的“自制图像”,即每像素1000×1000和3个通道(RGB值)

上传方式:

// 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()之前必须设置参数:

否则,在纹理查找时,每行会获得0-3字节的偏移量。这会导致纹理连续扭曲或倾斜

由于在
GL_UNSIGNED_BYTE
中使用源格式
GL_RGB
,每个像素由3个颜色通道(红色、绿色和蓝色)组成,每个颜色通道存储在范围[0,255]中的一个字节中

如果要将(
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纹理,然后尝试将自制的图像数据传递到纹理,并告诉我们什么不起作用。我意识到你需要指定ally为OpenGL创建无符号8位整数,以便将其正确解释为RGB值。我已经尝试了好几天,并在我决定发布这篇文章后的2分钟内设法解决了这个问题……呃,
GL\u unsigned\u INT
是一个有效的
glTexImage2D()
键入
”同样,您只需将颜色通道范围从[0,2^8-1]扩展到[0,2^32-1]。是的,我也得出了这个结论。我在我的原始帖子中添加了一个编辑clarify@lisyarus:Doh!谢谢修复:)不客气!我也觉得解释解包对齐的事情会很好。谢谢!经过几天的努力,我也设法解决了这个问题。似乎我不能使用普通的无符号整数,而是使用uint8\u t来创建8位,因为OpenGL似乎不熟悉太大的变量以及如何处理它们。@Jackbob您可以使用无符号整数,但在这种情况下,您必须指定
GL\u unsigned\u INT
,而不是
GL\u unsigned\u BYTE
。然而,我怀疑您是否真的需要这个:通道的一个字节在大多数情况下对人眼来说已经足够好了;谢谢
// 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]
    );
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
texdata[(y*WIDTH+x)*3+0] = R;
texdata[(y*WIDTH+x)*3+1] = G;
texdata[(y*WIDTH+x)*3+2] = B;