使用 "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 留下有用的评论。
我第一次在 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 留下有用的评论。