5

我在 Photoshop 中创建了一个带有已加载到 OpenGL 程序中的透明胶片的 png 图像。我已将它绑定到纹理,在程序中图片看起来很模糊,我不知道为什么。

替代文字 http://img685.imageshack.us/img685/9130/upload2.png

替代文字 http://img695.imageshack.us/img695/2424/upload1e.png

加载代码

// Texture loading object
nv::Image title;

// Return true on success
if(title.loadImageFromFile("test.png"))
{
    glGenTextures(1, &titleTex);
    glBindTexture(GL_TEXTURE_2D, titleTex);
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
    glTexImage2D(GL_TEXTURE_2D, 0, title.getInternalFormat(), title.getWidth(), title.getHeight(), 0, title.getFormat(), title.getType(), title.getLevel(0));
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f);
}

else
    MessageBox(NULL, "Failed to load texture", "End of the world", MB_OK | MB_ICONINFORMATION);

显示代码

glEnable(GL_TEXTURE_2D);    
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, titleTex);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTranslatef(-800, 0, 0.0);
glColor3f(1,1,1);

glBegin(GL_QUADS);
    glTexCoord2f(0.0, 0.0); glVertex2f(0,0);
    glTexCoord2f(0.0, 1.0); glVertex2f(0,600);
    glTexCoord2f(1.0, 1.0); glVertex2f(1600,600);
    glTexCoord2f(1.0, 0.0); glVertex2f(1600,0);
glEnd();
glDisable(GL_BLEND);    
glDisable(GL_TEXTURE_2D);

编辑:我不认为我在拉伸每个像素在坐标系中应该是两个

int width=800, height=600;
int left = -400-(width-400);
int right = 400+(width-400);
int top = 400+(height-400);
int bottom = -400-(height-400);
gluOrtho2D(left,right,bottom,top);
4

5 回答 5

4

OpenGL 将(通常)要求纹理本身的大小是 2 的幂,所以(可能)发生的事情是您的纹理被缩放到尺寸是 2 的幂的大小,然后它被缩放回原始尺寸——在被缩放两次的过程中,你失去了一些质量。

您显然只想在不进行任何缩放的情况下显示您的位图,而不是将其包装到另一个对象的表面或类似的东西(即,纹理的任何用途)。在这种情况下,我只是将其显示为位图,而不是纹理(例如,参见glRasterPos2iglBitmap)。

于 2010-04-27T21:50:09.577 回答
3

为什么首先要对开始屏幕上的静态图像使用 mipmapping 和各向异性过滤?看起来图像不太可能被旋转(各向异性过滤的用途)或必须非常快地多次调整大小(mipmapping 的用途)。

如果纹理被拉伸:尝试使用GL_NEARESTfor your GL_MAG_FILTER,在这种情况下它可以提供更好的结果(GL_LINEAR更准确,但具有模糊性质)。

如果纹理被最小化:同样的事情,尝试使用GL_NEAREST_MIPMAP_NEAREST,或者更好,尝试不使用 mipmap 和GL_NEAREST(或者GL_LINEAR,无论哪个给你最好的结果)。

于 2010-04-27T19:18:27.540 回答
2

我建议您使 png 的分辨率为 2 的幂。即 1024x512 并将您要绘制的部分放在它的左上角仍然在屏幕的分辨率中。然后将 texcoords 重新缩放为 800.0/1024.0 和 600.0/512.0 以从纹理中获取正确的部分。我相信正在发生的事情glTexImage2D有时可以处理不是 2 的幂的宽度和高度,但可以缩放输入图像从而对其进行过滤。

可以在此处查看处理此问题的示例(一个 iPhone - OpenGLES - 项目,它抓取非 2 次方的屏幕部分并将其绘制到 512x512 纹理中并GL_TEXTURE重新缩放矩阵,第 123 行,而不是手动重新缩放 texcoords )

是另一个提到这种方法的帖子。

于 2010-04-27T20:44:45.447 回答
1

这是一个假设:

您的窗口是 800x600(也许您的帧缓冲区也是),但您的客户区不是,因为侧面的窗口装饰。

因此,当您的帧缓冲区被传送到窗口的客户区域时,您的帧缓冲区会调整大小。你能检查你的窗口创建代码吗?

于 2010-04-27T19:55:40.717 回答
0
  • 注意窗口客户区的确切大小。仔细检查它是你所期望的
  • 注意像素对齐规则。您可能需要在 x/y 坐标上添加 0.5 才能达到像素中心。可在此处找到 DirectX 的说明- 不过,OpenGL 规则可能有所不同。
于 2010-04-27T20:35:51.720 回答