我在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);
glGetError
没有任何报告。我可能做错了什么?更重要的是,调试此类事情的正确工具和技术是什么,因为遇到这种问题并且无法以任何有意义的方式在调试器中“逐步完成”是一件令人失望的事情。
谢谢!
答案 0 :(得分:3)
glTexParameteri()和朋友控制每个纹理状态,而不是全局GL状态。在发出之前尝试绑定要更改的纹理。
as-is myTextureRef很可能是incomplete。
答案 1 :(得分:3)
是的,总的来说,有工具。 gDEBugger是用于此类事情的标准GL调试器。这是一种商业产品。
备选方案包括自己遮蔽GL状态,或尝试对您使用的实现进行反向工程(一般情况下,这不太可能正常工作,除非您的平台提供调试实现,但some people有很多乐趣用这个)。
或者......你总是可以使用Mesa,然后介入。
答案 2 :(得分:1)
如果你画的是什么结果 四边形没有纹理和没有 设置颜色?如果它是黑色的尝试 使用GL_REPLACE而不是 GL_MODULATE。 - 莫里斯吉尔登3月11日 在16:15
这样做了。 MODULATE无效。 REPLACE做到了。 谢谢莫里斯。