调试基本的OpenGL纹理失败了吗? (苹果手机)

时间:2010-03-11 14:56:05

标签: iphone opengl-es textures

我在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的内容。

我可能做错了什么?更重要的是,调试此类事情的正确工具和技术是什么,因为遇到这种问题并且无法以任何有意义的方式在调试器中“逐步完成”是一件令人失望的事情。

谢谢!

3 个答案:

答案 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做到了。 谢谢莫里斯。