Quad Texture奇怪的行为OpenGL老GPU

时间:2018-01-17 20:29:12

标签: delphi opengl pascal lazarus

我正在为学校编写Pascal项目(使用Lazarus),当项目在其中一台学校计算机上执行时,我遇到了一些奇怪的行为。

从2011年开始,我的笔记本电脑在NVidia 650M上运行得非常好。学校的计算机驱动程序已经过时,因此它回归到Windows GDI,它基本上是OpenGL 1.1的软件实现。因此,显卡可能不是问题的原因。

另外值得一提的是,只有在对mag和min过滤器使用GL_NEAREST方法时才会发生这种情况。例如,对GL使用GL_LINEAR而MIN为GL_NEAREST时,不会出现此问题。

这是加载纹理的代码:

tex := LoadTGA(filename);
if tex.iType = 2 then
begin
  glGenTextures(1, @(Result.textureID));
  glBindTexture(GL_TEXTURE_2D, Result.textureID);

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

  if tex.bpp = 3 then glFormat := GL_BGR
  else glFormat := GL_BGRA;

  glTexImage2D(GL_TEXTURE_2D, 0, tex.bpp, tex.w, tex.h, 0, glFormat, GL_UNSIGNED_BYTE, tex.data);

  FreeMem(tex.data);
end;

这是呈现quad的代码:

glColor3ub(255, 255, 255);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, q.surface.textureID);
glBegin(GL_QUADS);
  glTexCoord2f(0, 1); glVertex3f(q.points[0].x, q.points[0].y, q.points[0].z);
  glTexCoord2f(1, 1); glVertex3f(q.points[1].x, q.points[1].y, q.points[1].z);
  glTexCoord2f(1, 0); glVertex3f(q.points[2].x, q.points[2].y, q.points[2].z);
  glTexCoord2f(0, 0); glVertex3f(q.points[3].x, q.points[3].y, q.points[3].z);
glEnd;
glDisable(GL_TEXTURE_2D);

纹理的格式为32x32像素。

更新 事实证明,彩色四边形也会遇到类似的错误。在带有彩色四边形的图片中,似乎GDI首先进行裁剪,然后应用颜色。应该是相反的方式。现在我们必须找出原因。 我在下图中画了剪裁三角形的边缘,等等,你可以看到纹理“不一致”的确切位置

图片: bug1 bug2 bug3 bug4

1 个答案:

答案 0 :(得分:0)

很难猜到。问题可能与Nvidia和ATI驱动程序中实现的纹理插值的差异有关。使用GL_LINEAR,您可以使用不同的插值方法和" seam"不可见。 一些想法:

  • 尝试用纯色填充四边形,例如黄色,然后检查是否还可以看到单独的三角形。
  • 使用两个三角形(6个顶点)而不是GL_QUADS创建四边形。
  • 您是以逆时针顺序传递顶点吗?