【问题标题】:OpenGL texture not workingOpenGL纹理不起作用
【发布时间】:2011-12-25 05:57:56
【问题描述】:

我正在尝试学习如何在 OpenGL 中使用纹理。我开始阅读 OpenGL Redbook 中关于纹理映射的章节。我不明白,所以我用谷歌搜索并找到了this tutorial。我按照说明进行操作,但仍然无法正常工作。 This 是代码。

This 是我的纹理图像。我使用 Photoshop 将其转换为 this。文件大小为 175KB,大小合适(200x300x3=180000)。

我试图在另一个程序中读取文件,看看内容是否正确。看来我只能读取大约 221 个像素(它大约是图像的第一行)并且它达到了 eof()。在我的程序中,我阅读的内容与我预期的一样多,但是当我调试时,我注意到在某些点之后字节被 归零

现在我很困惑。我的程序有问题吗?质地有问题吗?我有问题吗?我究竟做错了什么?我该如何解决?

【问题讨论】:

    标签: c++ opengl texture-mapping texture2d


    【解决方案1】:

    问题在于您的代码。您尝试使用文本模式读取二进制文件。而是使用以下代码:

    ifstream tex("ace.raw", ios::in | ios::binary);
    if(tex.is_open())
      for(int j=0; j<imH; ++j)
        for(int i=0; i<imW; ++i)
          for(int k=0; k<3; ++k)
          {
            face[j][i][k] = tex.get();
          }
    
    tex.close();
    

    或者更短且等效的代码:

    ifstream tex("ace.raw", ios::in | ios::binary);
    if (tex.is_open())
      tex.read((char*)face, sizeof(face));
    
    tex.close();
    

    两个代码都经过测试,“face”变量包含与“ace.raw”完全相同的内容。

    【讨论】:

    • 令我惊讶的是,这似乎解决了它。以文本模式或二进制模式读取文件有什么区别?!它应该包含相同的数据,不是吗?
    • 在文本模式下,您仅限于可打印的 ASCII 范围,一些值可以控制阅读器的行为,而二进制模式只是读取您存储的任何内容。
    【解决方案2】:

    纹理是如何出现的?是垃圾吗?它只是纯白色(即没有纹理)吗?根据您的显卡,您的纹理可能需要 2 作为宽度/高度的幂和/或您的纹理必须是正方形。不使用 mipmap 是否可以工作?

    即使无法读取完整的文件或其中有一些损坏的数据,如果读取文件变得疯狂,您至少应该看到一些垃圾作为纹理。

    【讨论】:

    • 它曾经是黑色的(读取零)。然后在稍微编辑之后,它变成了灰白色。由于 Osman 的解决方案有效,因此没有两种纹理的幂。如果没有 mipmap,它具有相同的结果。
    【解决方案3】:

    不,没有问题。图像可以包含许多零字节,要读取所有内容而不会丢失任何内容,请确保统计其大小。

    【讨论】:

    • 我正在循环读取整个文件 200x300x3 并读取 RGB 信息,而忽略了我正在读取零的事实。问题是它实际上也显示零(黑色纹理)!这是错误的。我上传了实际图片,以便您可以看到它的样子。
    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 2013-04-21
    • 2017-11-26
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多