【问题标题】:OpenGL Texture LoadingOpenGL 纹理加载
【发布时间】:2010-01-10 02:48:08
【问题描述】:

大家晚上好, 我在这里绕圈子,但我想我找错了地方。

我的问题是我将如何加载图像并将其应用于 openGL 中的图元。例如加载 bmp 或 jpg 并将其应用到 glutsolidsphere。

该解决方案会仅限于一个平台,还是可以在所有平台上运行?

感谢您的帮助

【问题讨论】:

    标签: opengl


    【解决方案1】:

    好吧,如果您愿意,您可以编写自己的 bmp 加载程序。 Here 是规范和一些代码。否则,我碰巧有一个 tga loader here。一旦你这样做了,它将以无符号字符数组的形式返回数据,也称为 GL_UNSIGNED_BYTE。

    要从这个数组中创建一个 OpenGL 纹理,您首先定义一个变量,该变量将用作对 OpenGL 内存中该纹理的引用。

    GLuint textureid;
    

    然后,您需要告诉 OpenGL 为新纹理腾出空间:

    glGenTextures(1, &textureid);
    

    然后,您需要将该纹理绑定为当前使用的纹理。

    glBindTexture(GL_TEXTURE_2D, textureid);
    

    最后,你需要告诉 OpenGL 当前纹理的数据在哪里。

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, your_data);
    

    然后,当您渲染图元时,您可以通过再次调用 glBindTexture 将其应用到图元:

    
    glBindTexture(GL_TEXTURE_2D, textureid);
    glBegin(GL_QUAD);
         glTexCoord2f(0.0, 0.0);
         glVertex3f(0.0, 0.0, 0.0);
         glTexCoord2f(1.0, 0.0);
         glVertex3f(1.0, 0.0, 0.0);
         glTexCoord2f(1.0, 1.0);
         glVertex3f(1.0, 1.0, 0.0);
         glTexCoord2f(0.0, 1.0);
         glVertex3f(0.0, 1.0, 0.0);
    glEnd();
    

    但是,任何时候将纹理应用于图元时,都需要纹理坐标数据和顶点数据,而 glutSolidSphere 不会生成纹理坐标数据。要对球体进行纹理处理,可以自己生成,也可以调用 texgen 函数,或者使用着色器。

    【讨论】:

      【解决方案2】:

      有无数种方法可以将图像纹理映射到球体上。您可以查看 gltexgen 命令以自动为 glut 球体生成纹理坐标。

      【讨论】:

        【解决方案3】:

        它可能比你想象的要复杂。

        首先,我很确定您不能对使用glutSolidSphere 绘制的球体进行纹理处理,因为该函数没有为其绘制的顶点指定纹理坐标。因此,您需要编写一个方法来逐个顶点或使用顶点缓冲区绘制球体,并确保为每个顶点指定纹理坐标。

        完成后,您需要加载图片。 OpenGL 不提供从文件中加载图像的功能,如果我没记错的话,glu 和 glut 也不提供。因此,您必须自己读取图像文件,或者使用这样做的库。 DevIL 就是其中之一。

        获得图像的像素数据后,您需要使用它创建一个新的 OpenGL 纹理。一些图像加载库可以为您做到这一点。 DevIL 可以。

        我强烈建议在谷歌上搜索一些教程,但请不要使用 NeHe 教程,它们的质量通常很差。

        【讨论】:

          【解决方案4】:

          内德很好地描述了它。您应该阅读来自NeHe 的教程,其中详细描述了每个步骤。正如其他人所指出的,纹理四边形将是一个好的开始,而球体可能有点棘手。

          【讨论】:

            【解决方案5】:

            这很有趣,TGA 是我能够成功加载到纹理中的第一种类型的图像文件。不幸的是,OpenGL 没有自己的内置 API 函数来直接读取文件。因此需要任何外部库或代码。 TGA 格式很简单,Ned 为它提供了一些很好的代码。

            【讨论】:

              猜你喜欢
              • 2023-03-31
              • 2013-11-27
              • 2017-06-11
              • 2010-12-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-08-31
              • 2011-02-09
              相关资源
              最近更新 更多