【问题标题】:OpenGL loading multiple textures - not workingOpenGL加载多个纹理 - 不工作
【发布时间】:2012-07-23 00:03:47
【问题描述】:

我已经使用我拥有的 gltLoadTGA 函数成功加载了单个纹理。现在我正在尝试加载多个纹理它不起作用。这是我的设置功能的纹理部分:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glGenTextures(numTextures, textures);

// Load the first texture
glBindTexture(GL_TEXTURE_2D, textures[SHAPE_TEX]);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
pBytes = gltLoadTGA("TexasFlag.tga", &iWidth, &iHeight, &iComponents, &eFormat);
glTexImage2D(GL_TEXTURE_2D, 0, iComponents, iWidth, iHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBytes);
free(pBytes);

// Load the "A"
glBindTexture(GL_TEXTURE_2D, textures[A_TEX]);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
pBytesA = gltLoadTGA("letter a.tga", &iWidth, &iHeight, &iComponents, &eFormat);
glTexImage2D(GL_TEXTURE_2D, 0, iComponents, iWidth, iHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBytesA);
free(pBytesA);

// Load the "B"
glBindTexture(GL_TEXTURE_2D, textures[B_TEX]);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
pBytesB = gltLoadTGA("letter b.tga", &iWidth, &iHeight, &iComponents, &eFormat);
glTexImage2D(GL_TEXTURE_2D, 0, iComponents, iWidth, iHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBytesB);
free(pBytesB);

// Load the "C"
glBindTexture(GL_TEXTURE_2D, textures[C_TEX]);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
pBytesC = gltLoadTGA("letter c.tga", &iWidth, &iHeight, &iComponents, &eFormat);
glTexImage2D(GL_TEXTURE_2D, 0, iComponents, iWidth, iHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBytesC);
free(pBytesC);

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glEnable(GL_TEXTURE_2D);

而我的绘图功能基本上是: glBindTexture(GL_TEXTURE_2D, SHAPE_TEX); // 画很多...

但根本没有显示任何纹理。怎么了?

**顺便说一句,这只能在 C 中,而不是 C++

【问题讨论】:

    标签: c opengl textures


    【解决方案1】:

    当您调用glTexParameteri (man page) 时,它只适用于当前纹理。您必须为每个要更改其参数的纹理单独调用它,您绑定纹理之后。未能设置缩小/放大过滤器会使它看起来像纹理加载失败。

    您可能还希望在尝试加载纹理后调用glGetError,看看它是否失败。

    【讨论】:

    • 具有讽刺意味的是,操作系统为每个纹理上传设置的glPixelStorei 设置没有绑定到纹理对象。
    • @datenwolf:当您开始考虑具有客户端-服务器模型的 OpenGL 时,这些区别实际上很有意义。例如,数组(OpenGL 1.x 变种)都是客户端的,因此它们使用glEnableClientState 等进行管理。基本上任何直接接触程序内存的东西都会通过客户端,这包括纹理打包和解包。客户端将像素打包或解包到用户可以提供的无数格式中,而服务器只需要处理打包的数据。所以glPixelStore 的行为应该不足为奇。
    • 谢谢,我非常熟悉 OpenGL 的客户端服务器模型,并且经常将它用于 OpenGL over GLX over TCP。
    • @datenwolf:这是一个不同的概念。我说的是 OpenGL 本身内部的客户端/服务器模型,即使您不使用网络也是如此。 OpenGL API 的部分操作客户端状态,例如glPixelStore,它在文档中指出“像素存储模式是客户端状态”。不需要 TCP,不需要 GLX。客户端/服务器模型解释了为什么有单独的函数glPushAttribglPushClientAttrib
    • 您认为 OpenGL 客户端/服务器模型源于何处?提示:SGI、Irix(= Unix)、X11(服务器和客户端)。显示列表的概念也是 X11 对 OpenGL 的直接影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 2013-09-16
    • 2014-08-29
    • 1970-01-01
    相关资源
    最近更新 更多