c++ - OpenGL 纹理未按定义出现

标签 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

这里发生了什么?那个桃色的部分很奇怪,会是哪里来的?

最佳答案

虽然您已经在评论中提到了您是如何解决这个问题的,但我想我可以在这里解释哪里出了问题:

我忽略了对齐。默认情况下,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);

在指定纹理数据之前。

关于c++ - OpenGL 纹理未按定义出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22005144/

相关文章:

c++ - 在理解 C++ 中的友元函数时出错

c++ - 通过 C++ 在 Tclsh 中即时字体着色

c++ - 无法获得渲染为四边形并显示的简单帧缓冲区

ios - Texture ASButtonNode,如何在文字右边设置图片

android - 用包含 alpha 的位图替换纹理像素(函数 texSubImage2D)

c++ - 为类成员分配内存

c++ - 无法使用带有 std::move 的自定义删除器插入 std::unique_ptr

java - 使用 Ortho2D 在 OpenGL 中映射四边形纹理时出现问题

c++ - 在 OSX 上链接 OpenGL 框架

java - LWJGL 加载的 OBJ 模型有一个没有纹理的黑色区域