【问题标题】:OpenGL Rending multiple triangle strips results in gapsOpenGL渲染多个三角形条导致间隙
【发布时间】:2011-11-03 04:56:54
【问题描述】:

我正在使用 C++ 和 Qt 作为支持演员首次涉足 OpenGL。

在我的操场上实现主应用程序之外的功能,我试图从一个二维浮点数组中绘制一个网格表面。此二维数组的索引用于 x 和 z 坐标,值为 y 坐标。

目前我的实现有问题。没有创建一个实体表面,而是有明显的黑色间隙。

Google 快速向我展示了http://marc.blog.atpurpose.com/2009/10/24/programatically-generating-a-rectangular-mesh-using-single-gl_triangle_strip/,这与我的渲染方法非常相似。但是,我在绘制了一排三角形并在最后开始一个新的条带后终止了我的三角形条带。

下面是一些示例调试输出,显示了我正在创建的顶点:

glBegin
drawing vertex ( 0 , 2.76401 , 3 ) 
drawing vertex ( 0 , 1.82236 , 4 ) 
drawing vertex ( 1 , 1.55657 , 3 ) 
drawing vertex ( 1 , 3.82013 , 4 ) 
drawing vertex ( 2 , 3.1032 , 3 ) 
drawing vertex ( 2 , 2.77563 , 4 ) 
drawing vertex ( 3 , 2.2032 , 3 ) 
drawing vertex ( 3 , 4.49317 , 4 ) 
drawing vertex ( 4 , 0.469515 , 3 ) 
drawing vertex ( 4 , 1.48398 , 4 ) 
drawing vertex ( 5 , 0.301526 , 3 ) 
drawing vertex ( 5 , 0.606281 , 4 ) 
drawing vertex ( 6 , 1.12292 , 3 ) 
drawing vertex ( 6 , 1.98806 , 4 ) 
glEnd/glBegin
drawing vertex ( 0 , 4.31023 , 2 ) 
drawing vertex ( 0 , 2.76401 , 3 ) 
drawing vertex ( 1 , 3.64741 , 2 ) 
drawing vertex ( 1 , 1.55657 , 3 ) 
drawing vertex ( 2 , 2.48897 , 2 ) 
drawing vertex ( 2 , 3.1032 , 3 ) 
drawing vertex ( 3 , 4.54997 , 2 ) 
drawing vertex ( 3 , 2.2032 , 3 ) 
drawing vertex ( 4 , 0.11039 , 2 ) 
drawing vertex ( 4 , 0.469515 , 3 ) 
drawing vertex ( 5 , 1.12043 , 2 ) 
drawing vertex ( 5 , 0.301526 , 3 ) 
drawing vertex ( 6 , 4.27371 , 2 ) 
drawing vertex ( 6 , 1.12292 , 3 ) 
glEnd/glBegin
drawing vertex ( 0 , 0.818045 , 1 ) 
drawing vertex ( 0 , 4.31023 , 2 ) 
drawing vertex ( 1 , 0.886993 , 1 ) 
drawing vertex ( 1 , 3.64741 , 2 ) 
drawing vertex ( 2 , 0.612948 , 1 ) 
drawing vertex ( 2 , 2.48897 , 2 ) 
drawing vertex ( 3 , 4.69348 , 1 ) 
drawing vertex ( 3 , 4.54997 , 2 ) 
drawing vertex ( 4 , 3.56293 , 1 ) 
drawing vertex ( 4 , 0.11039 , 2 ) 
drawing vertex ( 5 , 2.22925 , 1 ) 
drawing vertex ( 5 , 1.12043 , 2 ) 
drawing vertex ( 6 , 0.15616 , 1 ) 
drawing vertex ( 6 , 4.27371 , 2 ) 
glEnd/glBegin
drawing vertex ( 0 , 1.84323 , 0 ) 
drawing vertex ( 0 , 0.818045 , 1 ) 
drawing vertex ( 1 , 2.28323 , 0 ) 
drawing vertex ( 1 , 0.886993 , 1 ) 
drawing vertex ( 2 , 1.1108 , 0 ) 
drawing vertex ( 2 , 0.612948 , 1 ) 
drawing vertex ( 3 , 3.72698 , 0 ) 
drawing vertex ( 3 , 4.69348 , 1 ) 
drawing vertex ( 4 , 4.41645 , 0 ) 
drawing vertex ( 4 , 3.56293 , 1 ) 
drawing vertex ( 5 , 4.69124 , 0 ) 
drawing vertex ( 5 , 2.22925 , 1 ) 
drawing vertex ( 6 , 3.11876 , 0 ) 
drawing vertex ( 6 , 0.15616 , 1 ) 
glEnd

还有我看到的截图(不同的顶点值):

我正在寻找有关我可能做错了什么的任何线索或见解。正如我所说,我对 OpenGL 很陌生。我没有使用单三角带网格方法,因为我相信它会在最终应用中出现问题。

更新:我玩弄了我的 y 值,并注意到只有当我使用从生成的 y 随机数时,渲染才会出现问题

qrand() / (float)(RAND_MAX) * 5.0f

使用常量值 (y = 1.0f)、y = x 或类似 y = z % 2 == 0 ? x : xMax - x 时。

【问题讨论】:

  • 我有点放弃了我的 OpenGL 问题。没有合适的书籍资源来充分学习和理解正在发生的事情。找到了一个库,可以满足我 99% 的需求。

标签: c++ qt opengl


【解决方案1】:

猜测:

您是否启用了面部剔除功能?您将顶点发送到 openGL 的顺序决定了三角形是正面还是背面。您可以使用 glFrontFace 控制哪个方向,CW 或 CCW(CCW 是默认值)被视为正面。

尝试禁用面部剔除; glDisable(GL_CULL_FACE);看看它是否修复了您的图像。

如果这确实是你的问题,你应该保持启用面部剔除,但修复你将顶点发送到 openGL 的顺序。

【讨论】:

  • 有没有机会将顶点颜色设置为黑色?如果不是这样,您可能需要发布代码。
  • 顶点颜色永远不会是黑色的。我正在使用 alpha 混合,但关闭它不会改变任何东西。我将在今天晚些时候发布更多详细信息。
【解决方案2】:

对于我来说,openGl 已经有一段时间了(然后,它是 iPod 上的 OpenGL-ez)。但是渲染看起来像条带不在 X,Z 中的常规网格上。我会减小 Y 的范围(甚至将其设置为 0)来测试您的三角形条带。

另外,所有东西都是作为浮点数发送的吗?我对显示 1,2 等而不是 1.0、2.0 的调试输出有点怀疑。

【讨论】:

  • 根据新发现更新了我的问题。
  • 天哪,我希望它们不是随机的!但听起来有时三角形“太陡”。你有一定程度的环境照明吗?再一次,将 Y 的范围缩小到一个合理的表面,至少看看发生了什么。
  • 我现在将保持原样并使用更多功能。照明在该列表中。也许它会... 阐明情况。
【解决方案3】:

我最终放弃了我的渲染并使用了一个提供我需要的库(一旦我开始工作)。对于那些感兴趣的人,图书馆是QwtPlot3D。它需要对我的需求进行一些重大的性能改进,但它让我绕过了这个最初的障碍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 2020-04-05
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多