OpenGL 纹理显示有线而不是纯色
OpenGL Texture Showing Wired Lines instead of solid color
我的代码
void SetPixel(int x, int y)
{
unsigned char* offset = mImageData + (x + mImageHeight * y) * sizeof(unsigned char) * 3;
offset[0] = 255;
offset[1] = 0;
offset[2] = 0;
}
和
for (int j = imageHeight - 1; j >= 0; j--)
{
for (int i = 0; i < imageWidth; i++)
{
SetPixel(i, j);
}
}
OpengL 代码:
创建:
m_InternalFormat = GL_RGB8;
m_DataFormat = GL_RGB;
m_Data = new unsigned char[宽 * 高 * 3];
glGenTextures(1, &m_RendererID);
glBindTexture(GL_TEXTURE_2D, m_RendererID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glGenerateMipmap(GL_TEXTURE_2D);
设置数据:
glBindTexture(GL_TEXTURE_2D, m_RendererID);
if(alpha)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, m_Width, m_Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
else
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, m_Width, m_Height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
现在我应该得到一个红色纹理,但我得到的是:
见左上角。贴图不对
我认为这可能是因为没有设置正确的像素偏移。但我无法弄清楚到底出了什么问题?请帮助。
默认情况下,OpenGL 假定图像的每一行的开始对齐到 4 个字节。这是因为默认情况下 GL_UNPACK_ALIGNMENT
参数为 4。由于图像具有 3 个颜色通道 (GL_RGB
),并且被紧密打包,因此图像的一行大小可能不会对齐到 4 个字节。
当具有 3 个颜色通道的 RGB 图像被加载到纹理对象并且 3*width 不能被 4 整除时,GL_UNPACK_ALIGNMENT
必须设置为 1,然后用 glTexImage2D
指定纹理图像:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, m_Width, m_Height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
我的代码
void SetPixel(int x, int y)
{
unsigned char* offset = mImageData + (x + mImageHeight * y) * sizeof(unsigned char) * 3;
offset[0] = 255;
offset[1] = 0;
offset[2] = 0;
}
和
for (int j = imageHeight - 1; j >= 0; j--)
{
for (int i = 0; i < imageWidth; i++)
{
SetPixel(i, j);
}
}
OpengL 代码:
创建: m_InternalFormat = GL_RGB8; m_DataFormat = GL_RGB; m_Data = new unsigned char[宽 * 高 * 3];
glGenTextures(1, &m_RendererID);
glBindTexture(GL_TEXTURE_2D, m_RendererID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glGenerateMipmap(GL_TEXTURE_2D);
设置数据:
glBindTexture(GL_TEXTURE_2D, m_RendererID);
if(alpha)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, m_Width, m_Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
else
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, m_Width, m_Height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
现在我应该得到一个红色纹理,但我得到的是:
见左上角。贴图不对
我认为这可能是因为没有设置正确的像素偏移。但我无法弄清楚到底出了什么问题?请帮助。
默认情况下,OpenGL 假定图像的每一行的开始对齐到 4 个字节。这是因为默认情况下 GL_UNPACK_ALIGNMENT
参数为 4。由于图像具有 3 个颜色通道 (GL_RGB
),并且被紧密打包,因此图像的一行大小可能不会对齐到 4 个字节。
当具有 3 个颜色通道的 RGB 图像被加载到纹理对象并且 3*width 不能被 4 整除时,GL_UNPACK_ALIGNMENT
必须设置为 1,然后用 glTexImage2D
指定纹理图像:
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, m_Width, m_Height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);