0

我正在使用 OpenGL,我可以正确加载 tga 文件,但是由于某种原因,当我渲染 jpg 文件时,我看不到它们。

这就是图像应该看起来的样子——

在此处输入图像描述

这就是它的样子……为什么它被拉长了?是因为坐标吗?

在此处输入图像描述

这是我用于绘图的代码。

void Renderer::DrawJpg(GLuint tex, int xi, int yq, int width, int height) const
{
glBindTexture(GL_TEXTURE_2D, tex);
glBegin(GL_QUADS);
glTexCoord2i(0, 0); glVertex2i(0+xi,   0+xi);
glTexCoord2i(0, 1); glVertex2i(0+xi,   height+xi);
glTexCoord2i(1, 1); glVertex2i(width+xi, height+xi);
glTexCoord2i(1, 0); glVertex2i(width+xi, 0+xi);
glEnd();
}

这就是我加载图像的方式......

imagename=s;
ILboolean success;
ilInit();
ilGenImages(1, &id);
ilBindImage(id);
success = ilLoadImage((const ILstring)imagename.c_str());
if (success)
{
    success = ilConvertImage(IL_RGB, IL_UNSIGNED_BYTE); /* Convert every colour component into
                                                         unsigned byte. If your image contains alpha channel you can replace IL_RGB with IL_RGBA */
    if (!success)
    {
        printf("image conversion failed.");
    }
    glGenTextures(1, &id);
    glBindTexture(GL_TEXTURE_2D, id);

    width = ilGetInteger(IL_IMAGE_WIDTH);
    height = ilGetInteger(IL_IMAGE_HEIGHT);

    glTexImage2D(GL_TEXTURE_2D, 0, ilGetInteger(IL_IMAGE_BPP), ilGetInteger(IL_IMAGE_WIDTH),
                 ilGetInteger(IL_IMAGE_HEIGHT), 0, ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE,
                 ilGetData());
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);       // Linear Filtered
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);       // Linear Filtered
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

我可能应该提到这一点,但有些图像确实得到了正确渲染,我认为这是因为宽度!= 高度。但事实并非如此,宽度!= 高度的图像也可以正常加载。但对于其他图像,我仍然遇到这个问题。

4

2 回答 2

1

你可能需要打电话

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

在使用 . 上传纹理数据之前glTexImage2D

参考页面

GL_UNPACK_ALIGNMENT

指定内存中每个像素行开头的对齐要求。允许的值为 1(字节对齐)、2(与偶数字节对齐的行)、4(字对齐)和 8(行从双字边界开始)。

对齐的默认值为 4,并且您的图像加载库可能会返回具有字节对齐行的像素数据,这解释了为什么您的某些图像看起来不错(当宽度是四的倍数时)。

于 2014-04-22T13:53:46.680 回答
1

始终尝试使图像的宽度和高度为 2 的次方,因为某些 GPU 仅支持 NPOT 分辨率的纹理。(例如 128x128、512x512 但不是 123x533、128x532)

而且我认为在这里而不是 GL_REPEAT 你应该使用 GL_CLAMP_TO_EDGE :) 当你的纹理坐标> 1.0f 时使用 GL_REPEAT,CLAMP_TO_EDGE 但保证图像将填充多边形而边缘上没有不需要的线条。(它阻止了边缘的线性过滤)

请记住尝试使用浮点数的代码(来自评论的示例):)

这是很好的解释http://open.gl/textures :)

于 2014-04-21T08:42:23.987 回答