通过 Glut 为 OpenGL 自定义纹理映射

Posted

技术标签:

【中文标题】通过 Glut 为 OpenGL 自定义纹理映射【英文标题】:Custom Texture Mapping for OpenGl through Glut 【发布时间】:2011-05-31 11:51:09 【问题描述】:

我要做的是创建易于加载和使用的自定义模型和纹理文件。基本上,这些文件是代表 XYZ 和 RGB 值的浮点列表。 就像: 0.5 0.234 0.1 ... ...

问题是我无法让我的浮点数组为纹理工作。 这是我定义数组的方式:

float* textureMap;

我是这样初始化的:

const int SIZE = (128*128*3);

textureMap = (float*)malloc(sizeof(textureMap)*SIZE);

for (int i =0; i<SIZE; i++) textureMap[i] = 0.0f;

现在使用 Glut,我创建了一个窗口,允许我使用数据绘制和填充数组,并且您可以看到所有 RGB 值都已初始化为 0.0f,所以我至少希望看到我的对象是黑色的,但是它只是保持默认的灰色,永远不会变成与我的纹理数组中相同的颜色。

这是我创建纹理的调用:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 130, 130, 0, GL_RGB, GL_FLOAT, textureMap);

根据 OpenGL 官方网页上的指南,我已将宽度和高度设为 2^n + 2,但考虑到我尝试构建浮点数组的方式,我不确定这是否正确。

我也尝试调用 glGetError() 没有成功(也就是说,没有错误被抛出,我确保我可以通过将宽度和高度设置为 -1 来抛出错误)。

我已确保在调用 glBegin() 之前绑定了纹理,甚至检查了这些调用是否有错误。

任何建议/指针?有没有其他人尝试过定义自己的纹理格式?

顺便说一句,目前我使用的是四边形而不是三角形,这很好吧?

【问题讨论】:

这里有更多关于我如何创建/使用纹理的信息:GLuint textures[1];glGenTextures(1, &textures[0]); glBindTexture(GL_TEXTURE_2D, textures[0]);glBindTexture(GL_TEXTURE_2D, textures[0]); 宽度和高度为 2^n + 2*border。但是您没有边框,因此 with 和 height 仅为 128。 也许我应该提一下,我正在使用 mac osX,尝试在绘制四边形之前使用 glTexImage2D 重新加载纹理,以及在我调用绘制四边形之前和之后启用和禁用 gl_texture_2d 没有成功,任何我可能没有设置的参数?我正在尝试遵循在线示例,但到目前为止没有任何工作正常,一直在调整学校的代码,但我们在那里使用 linux 机器并且之前来回遇到了麻烦。我正在考虑删除我的其他一些电话以尝试解决此问题。 在完整代码中看到一个最小的工作(或者在你的情况下被破坏)的例子会说一千个单词。否则这只是疯狂的猜测 【参考方案1】:

首先,确保您在渲染前调用glEnable(GL_TEXTURE_2D) 启用了纹理映射(我假设您目前不使用着色器,否则会在那里查找错误)。

其次,创建一个大小为 130x130 的纹理并用大小为 128x128 的数据填充它肯定是错误的。您似乎误解了这些指南(也许他们说了一些关于纹理边框的内容,但在您的示例中您没有任何边框,因此 128x128 应该没问题)。

【讨论】:

感谢您的回复,我确实在我的 init 函数中调用了 glEnable 并尝试使用 128(将其切换回来),在进入 glut 之前,我的 init 中也有以下几行主循环:glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 不,我没有使用着色器,你还能想到什么?【参考方案2】:

已解决!问题是我需要在绘制多边形的同一个函数中调用glTexImage2D(...)(doh!)。我一直在做的是,每当我在绘画窗口中编辑我的纹理时,我在同一个函数中调用glTexImage2D(...),然后使用glutPostWindowRedisplay(...) 告诉3D 窗口刷新。

具有讽刺意味的是,在 init 函数中调用 glTexImage2D(...) 也可以,但只是第一次,原因很明显。

谢谢大家!

【讨论】:

这可能不是真正的问题,而是一种症状。在哪里调用glTexImage2D 无关紧要,只要OpenGL 上下文处于活动状态并且当前绑定了纹理(由glBindTexture 绑定)。所以我想情况并非如此。在绘制之前在每一帧中设置纹理图像对于性能来说绝对不是一个好主意。

以上是关于通过 Glut 为 OpenGL 自定义纹理映射的主要内容,如果未能解决你的问题,请参考以下文章

使用 GLUT 在立方体上的 OpenGL 多纹理映射

找不到使用 C# 在 openGL 中将纹理应用于 3d 对象的方法

webgl 纹理

将纹理应用到线框

OpenGL中纹素和屏幕像素之间的一对一映射

如何将纹理应用到四边形以纹理立方体?