我正在为学校编写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首先进行裁剪,然后应用颜色。应该是相反的方式。现在我们必须找出原因。 我在下图中画了剪裁三角形的边缘,等等,你可以看到纹理“不一致”的确切位置
图片:
答案 0 :(得分:0)
很难猜到。问题可能与Nvidia和ATI驱动程序中实现的纹理插值的差异有关。使用GL_LINEAR
,您可以使用不同的插值方法和" seam"不可见。
一些想法:
GL_QUADS
创建四边形。