OpenGL纹理未显示为已定义

时间:2014-02-25 05:10:08

标签: c++ opengl textures

我正在设置一个硬编码纹理,用作我的OpenGL应用程序的调试纹理。定义它的函数是:

void Texture::initDebugTexture(void)
{
    unsigned char pixels[] = {
        255, 0, 255,
        0, 255, 255,
        255, 0, 255,
        0, 255, 255
    };

    debug.loadPixels(2, 2, GL_RGB, GL_UNSIGNED_BYTE, pixels);
    debug.setFiltering(GL_LINEAR_MIPMAP_LINEAR, GL_NEAREST);
}

loadPixels扩展为:

void Texture::loadPixels(int width, int height, GLenum colorFormat, GLenum type, void* pixels)
{
    clean();

    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);

    glTexImage2D(GL_TEXTURE_2D, 0, colorFormat, width, height, 0, colorFormat, type, pixels);
    glGenerateMipmap(GL_TEXTURE_2D);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
}

setFiltering只是:

void Texture::setFiltering(GLenum filterMin, GLenum filterMag, float aniso = 0.0f)
{
    bind();
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filterMin);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filterMag);
    if (aniso != 0.0f)
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso);
}

initDebugTexture中,我尝试使用洋红色/青色方格图案创建一个简单的2x2纹理,这样它就永远不会被误认为真正的纹理。不幸的是,这不是发生的事情,而是我得到了这个:

Obviously Incorrect Coloration

这里发生了什么?那个桃色的部分非常奇怪,它可能来自哪里?

1 个答案:

答案 0 :(得分:3)

你已经在评论中提到过你是如何解决这个问题的,我想我可以解释一下这里出了什么问题:

我忽略了alignmet。 GL默认情况下,GL期望每行在4字节边界上对齐,因此GL实际读取的数据与您的预期不符并且

[255, 0, 255], [0, 255, 255], [255,0,255], [0,255,255] 

成了

[255, 0, 255], [0, 255, 255], ___ ___ [255, 0, 255] [255, U, U] 

U表示未定义)。

正确地将数据与GL期望的数据对齐,或者通过glPixelStore设置GL_UNPACK_ALIGNMENT

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

在指定纹理数据之前。