在Mac OS上使用OpenGL 4.1损坏的纹理

时间:2019-05-28 10:21:01

标签: c++ macos opengl glsl

我正在尝试使用OpenGL 4.1着色器语言绘制纹理。 它在Windows上绝对可以正常工作,因此我很肯定着色器或坐标没有问题。 在Mac上,但是,纹理已损坏,如图所示:


enter image description here


如果您会注意到-有两个小的纹理看起来还可以。关于它们的独特之处在于,一个为16,第二个为32像素宽(2的幂)。因此,它必须在配置或像素存储中。不能支持不支持2的幂的纹理,因为它们位于旧版openGL上下文(不是GLSL)上。这是生成纹理的示例:

    unsigned char* pixels = convertedImage->m_pixelbufs.at(0);
    GLuint imageDepth = convertedImage->GetBitsPerPixel() == 24 ? GL_RGB : GL_RGBA;

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

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, convertedImage->GetWidth(), convertedImage->GetHeight(), 0, imageDepth, GL_UNSIGNED_BYTE, pixels);

    glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
    glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
    glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
    glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
    glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    glBindTexture(GL_TEXTURE_2D, 0);

我尝试使用其他glPixelStorei参数,但纹理始终被破坏。有任何线索吗?

1 个答案:

答案 0 :(得分:0)

问题出在另一个地方。在将PNG文件实际提取到内存中并采取相应措施之前,有一段旧代码检查扩展名 GL_ARB_texture_non_power_of_two 。在Windows上,尽管它已移至核心答案这一事实是- TRUE ,所以行为符合预期。在Mac上,由于它开始变得笨拙,答案是- FALSE ,所以行为是错误的。