【问题标题】:glCullFace is not correctly working, do you have answers for that?glCullFace 工作不正常,你有答案吗?
【发布时间】:2020-09-10 05:39:10
【问题描述】:

我正在渲染一个地形,因为底面永远不会被看到,我虽然面部剔除会带来不错的性能提升。我查了一个教程,找到了这些设置:

glCullFace(GL_FRONT);
glFrontFace(GL_CCW);

问题是,这只是部分工作。地形由四边形组成,每个四边形由两个直角三角形组成,我只看到两个三角形中的一个,如果我使用顺时针缠绕,我会看到另一个三角形。我正在使用索引来安全记忆,并且我已经在纸上绘制了索引的绕组应该如何,但不知何故它不起作用。

我像这样生成我的索引:

mapIndices[arrayIdx + 0] = i;
mapIndices[arrayIdx + 1] = i + 1;
mapIndices[arrayIdx + 2] = i + CHUNK_SIDE_LENGHT + 1;

mapIndices[arrayIdx + 5] = mapIndices[arrayIdx + 1];
mapIndices[arrayIdx + 4] = mapIndices[arrayIdx + 2];
mapIndices[arrayIdx + 3] = mapIndices[arrayIdx + 2] + 1;

不要对CHUNK_SIDE_LENGHT + 1 感到困惑,我想要CHUNK_SIDE_LENGHT 三角形,所以我需要CHUNK_SIDE_LENGHT + 1 一行的顶点。 正如我所说,我已经在纸上绘制了这个顺序并且缠绕是正确的,但是 OpenGL 不喜欢它。这可能与索引渲染有关吗?

【问题讨论】:

  • 这是原码吗?原始代码中的索引 (5 - 4 - 3) 是否也以相反的顺序排列?

标签: c++ opengl


【解决方案1】:

我在您的代码中看不到任何问题。

第一个三角形的缠绕顺序相同

0 : i
1 : i + 1
2 : i + CHUNK_SIDE_LENGHT + 1

2
 +
 | \
 |   \
 |     \         
 +-------+
0         1

作为第二个三角形的缠绕顺序:

3 : i + CHUNK_SIDE_LENGHT + 2
4 : i + CHUNK_SIDE_LENGHT + 1
5 : i + 1

4         3
 +-------+
   \     | 
     \   |
       \ |
         +
          5

【讨论】:

  • @falkus7 那么这个bug就在别的地方。索引的顺序是正确的。
  • @Rabbid76 我也在做这个项目,你知道这个错误是从哪里来的吗?
  • @user11914177 如果索引的顺序是这样的,那么问题不是由索引引起的。图形驱动程序不太可能有face culling 错误。 Primitive 类型是 GL_TRIANGLES,不是吗?
  • @Rabbid76 渲染调用如下所示:glDrawElements(GL_TRIANGLES, indicesSize, MAP_INDICES_ARRAY_GL_TYPE, 0);
  • @user11914177 问题中的代码是原始代码吗? arrayIdx 是否循环递增 6?有很多可能的错误。我只能猜测。这根本没有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多