【问题标题】:Debugging a basic OpenGL texture fail? (iphone)调试基本 OpenGL 纹理失败? (苹果手机)
【发布时间】: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。
  • 莫里斯:这解决了。我完蛋了。这么多我还是不明白。我希望这个框架附带一个调试系统,这样您就可以了解它试图做什么,而不是看到...一个大的空矩形。

标签: iphone opengl-es textures


【解决方案1】:

glTexParameteri() 和朋友控制每个纹理状态,而不是全局 GL 状态。在发布之前尝试绑定要更改的纹理。

按原样 myTextureRef 很可能是incomplete

【讨论】:

    【解决方案2】:

    是的,一般来说,有工具。 gDEBugger 是用于此类事情的标准 GL 调试器。这是一种商业产品。

    替代方案包括自己隐藏 GL 状态,或尝试对您使用的实现进行逆向工程(一般来说,这不太可能很好地工作,除非您的平台提供调试实现,但 some people 对此很感兴趣)。

    或者...您可以随时使用 Mesa,然后直接介入。

    【讨论】:

    • 感谢指点——注意到 gDEBugger,发现它很贵;无法判断这是真正的交易还是夜间飞行的事情。此外,仅针对视频链接 +1。
    【解决方案3】:

    如果你只画 四边形没有纹理和没有 设置颜色?如果是黑色试试 使用 GL_REPLACE 而不是 GL_MODULATE。 – 莫里斯·吉尔登 3 月 11 日 16:15

    这样做了。调制不起作用。替换了。 谢谢莫里斯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多