我的地板飞机的部分消失了

时间:2017-03-23 11:46:53

标签: c++ opengl rendering

我遇到了渲染问题。所讨论的对象是由两个三角形组成的大平面。它应该覆盖窗口的大部分区域,但是它的一部分消失并在相机移动和转动时重新出现(我从未看到整个平面)

请注意,缺少的部分不是整个三角形。

我已经弄乱了相机以找出它的来源,但我没有找到任何东西。 我还没有添加视锥体剔除。

我真的陷入困境,因为我不知道我的代码的哪一部分甚至不得不考虑解决这个问题。搜索主要是关于缺少整个三角形的问题,这不是这里发生的事情。

有关问题原因的指示可能是什么?

编辑: 我缩小了飞机尺寸并添加了另一种更适合测试的纹理。 现在我发现了这种行为:

This looks like I expect it to

If I move forward a bit more, this happens

看起来相机背后的几何图形是翻转和渲染的,即使它应该是不可见的?

编辑2: 我的顶点和片段着色器:

#version 330
in vec3 position;
in vec2 textureCoords;

out vec4 pass_textureCoords;

uniform mat4 MVP;


void main() {
  gl_Position = MVP * vec4(position, 1);
  pass_textureCoords = vec4(textureCoords/gl_Position.w, 0, 1/gl_Position.w);
  gl_Position = gl_Position/gl_Position.w;
}



  #version 330

in vec4 pass_textureCoords;

out vec4 fragColor;

uniform sampler2D textureSampler;

void main()
{
fragColor= texture(textureSampler, pass_textureCoords.xy/pass_textureCoords.w);
}

2 个答案:

答案 0 :(得分:0)

显然我的矩阵中存在一个错误,导致相机后面的顶点出现问题。我在着色器中删除了w中的所有分区并且执行了glPosition = -gl_Position(最初只是为了测试某些内容),它现在可以正常工作了。 我仍然需要弄清楚确切的问题,但它现在正在运作。

答案 1 :(得分:-1)

许多驾驶员不能很好地处理跨越z平面的大三角形,这取决于您的精确度设置和驱动程序'内部这些三角形可能会在支持的数值范围之外生成无效坐标。

要确保这不是问题,请尝试在几个分区中手动细分地板,而不是仅为整个楼层设置两个三角形。

这样做非常简单。你有类似这样的伪代码:

division_size_x = width / max_x_divisions
division_size_y = height / max_y_divisions

for i from 0 to max_x_divisions:
    for j from 0 to max_y_divisions:
        vertex0 = { i * division_size_x, j * division_size_y }
        vertex1 = { (i+1) * division_size_x, j * division_size_y }
        vertex2 = { (i+1) * division_size_x, (j+1) * division_size_y }
        vertex3 = { i * division_size_x, (j+1) * division_size_y }
        OutputTriangle(vertex0, vertex1, vertex2)
        OutputTriangle(vertex2, vertex3, vertex0)