【发布时间】:2010-03-11 14:56:04
【问题描述】:
我在 iPhone 上的 GL 中有一个非常基本的纹理贴图问题,我想知道有什么策略可以调试这种事情。
(坦率地说,只是盯着状态机调用并想知道其中是否有任何错误或顺序错误是无法生存的——有没有工具可以解决这个问题?)
我有一个 512x512 PNG 文件,我正在从磁盘加载(没有特别打包),创建一个 CGBitmapContext,然后调用 CGContextDrawImage 以从中获取字节。 (此代码本质上是从 Apple 示例中窃取的。)我正在尝试将纹理映射到“四边形”,代码看起来基本上像这样——都是平面 2D 的东西,没什么花哨的:
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
GLfloat vertices[8] = {
viewRect.origin.x, viewRect.size.height,
viewRect.origin.x, viewRect.origin.y,
viewRect.size.width, viewRect.origin.y,
viewRect.size.width, viewRect.size.height
};
GLfloat texCoords[8] = {
0, 1.0,
0, 0,
1.0, 0,
1.0, 1.0
};
glBindTexture(GL_TEXTURE_2D, myTextureRef); // This was previously bound to
glVertexPointer(2, GL_FLOAT , 0, vertices);
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
- 我所谓的纹理区域只是黑色。
- 我没有看到用于设置纹理的 CG 调用的调试输出。
-
glGetError没有报告。 - 如果我简化此代码块以仅绘制顶点,但设置纯色,则四边形区域会完全按预期亮起。
- 如果我事先立即将整个上下文清除为红色,我看不到红色 - 这意味着那里正在呈现某些内容,但不是我的 PNG 的内容。
我可能做错了什么?更重要的是,什么是调试这类事情的正确工具和技术,因为遇到这类问题并且无法在调试器中以任何有意义的方式“逐步解决”是一件很糟糕的事情。
谢谢!
【问题讨论】:
-
如果只绘制没有纹理且没有设置颜色的四边形,结果是什么?如果它是黑色的,请尝试使用 GL_REPLACE 而不是 GL_MODULATE。
-
莫里斯:这解决了。我完蛋了。这么多我还是不明白。我希望这个框架附带一个调试系统,这样您就可以了解它试图做什么,而不是看到...一个大的空矩形。