我遇到了渲染问题。所讨论的对象是由两个三角形组成的大平面。它应该覆盖窗口的大部分区域,但是它的一部分消失并在相机移动和转动时重新出现(我从未看到整个平面)
请注意,缺少的部分不是整个三角形。
我已经弄乱了相机以找出它的来源,但我没有找到任何东西。 我还没有添加视锥体剔除。
我真的陷入困境,因为我不知道我的代码的哪一部分甚至不得不考虑解决这个问题。搜索主要是关于缺少整个三角形的问题,这不是这里发生的事情。
有关问题原因的指示可能是什么?
编辑: 我缩小了飞机尺寸并添加了另一种更适合测试的纹理。 现在我发现了这种行为:
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);
}
答案 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)