使用 "glGenerateMipmap" 的 OpenGL 中 mip 映射纹理出现奇怪的锯齿状外观

Odd jagged appearance of mip-mapped textures in OpenGL using "glGenerateMipmap"

我第一次在 OpenGL 中试验 mip-maps。我按照this tutorial, which builds on this code. In the fragment shader做了如下修改:

vec2 uv = UV;
uv.y = 1-UV.y;
color = texture( myTextureSampler, uv, 1 ).rgb;

... 翻转 y 轴值(教程练习的一部分以获得正确的纹理)。 它还在最后一行设置 LOD 偏差,这样我就可以查看纹理中较粗糙的细节。

我还修改了教程的cpp file

第 29 行,关闭超级采样抗锯齿:

// glfwWindowHint(GLFW_SAMPLES, 4);

第 87 行,创建 mip-maps:

GLuint Texture = loadDDS("uvtemplate.DDS"); 
glBindTexture(GL_TEXTURE_2D, Texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glGenerateMipmap(GL_TEXTURE_2D);

从第 183 行开始,实现了简单的相机移动(以获得其外观的良好概览):

...
GLfloat rot = 0.0;
do{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glUseProgram(programID);

    rot += 0.003;
    View       = glm::lookAt(
                            glm::vec3(glm::cos(rot)*4.8, glm::cos(rot/3)*1.3+ 1.3 ,glm::sin(rot)*2.9), 
                            glm::vec3(0,0,0), 
                            glm::vec3(0,1,0)); 
    MVP        = Projection * View * Model; 
    glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);
    ...

我希望看到 input texture, instead it looks awful:

的模糊版本

“1”底部的锯齿状边缘对我来说毫无意义。它们出现在纹理中的一些图形上,但没有出现在其他图形上。

输入的纹理格式是.DDS,这会不会是问题的根源?这可能是我的驱动程序中的错误吗?我在 Ubuntu Linux 16.04,最新的驱动程序在 PPA:s 中找到。在网上搜索,没有找到关于这个主题的内容。

编辑:我还尝试了一些 openGL 设置,例如:

glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);

GLfloat anisoVal;
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &anisoVal);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisoVal);

但它什么也没做。

问题的根源是旧 driver。我正在使用的计算机有一个特殊的设置,其中 non-standard PPA 取代了 ubuntu (Canonical) 支持的 PPA。我无法访问特殊 intra-net(在客户处)之外的一些内容。没有阅读 sudo apt-get 更新时的错误消息。

从我的问题中得到的教训:如果您不更新图形,可能出现的错误类型以及它们如何影响您是不可预测的 drivers.... 即使您认为自己有更新了它们……双重和三重检查。感谢@derhass 和@Rabbid76 留下有用的评论。