深度测试问题

问题描述 投票:0回答:1

我有一个简单的OpenGL应用程序,我想绘制一个立方体,但是深度缓冲区似乎以某种方式无法正常工作。我正在将SFML用于windowin系统,并将GLEW作为库。

主要外观如下:https://pastebin.com/tq5t0TJN

...code...

网格类如下:https://pastebin.com/YiWH8dWH

...code...

加载函数如下所示:https://pastebin.com/vUNLn0gu-但它们似乎都可以正常工作

...code...

现在我有了一个顶点着色器:https://pastebin.com/EeP4RXHy

#version 330 core
layout (location = 0) in vec3 location_attrib;
layout (location = 1) in vec2 texcoord_attrib;
layout (location = 2) in vec3 normal_attrib;


out vec3 location;
out vec3 normal;


void main()
{
    normal = normal_attrib;
    gl_Position = vec4(location_attrib.x / 2, location_attrib.y  / 2, location_attrib.z  / 2, 1.0);
}

和片段着色器:https://pastebin.com/E9krMFZq

#version 330 core
out vec4 gl_FragColor;
//out float gl_FragDepth ;

in vec3 location;
in vec3 normal;

void main()
{
    vec3 normal_normalized = normalize(normal);
    vec3 light_dir = vec3(0, -1, 0);

    float light_amount = dot(normal_normalized, light_dir);

    vec3 color = vec3(1.0f, 0.5f, 0.2f);
    color = color * light_amount;
    color = clamp(color, vec3(0,0,0), vec3(1,1,1));
    color.r += 0.1;
    color.g += 0.1;
    color.b += 0.1;
    //gl_FragColor = vec4(color.r, color.g, color.b , 1.0);
    gl_FragDepth = location.z / 1000;
    gl_FragColor = vec4(vec3(gl_FragCoord.z), 1.0);
}

但是通过这种方式获得的图像看起来像这样:

Missrendered box

任何人都可以说出什么问题吗?

我试图弄清楚深度测试出了什么问题,尝试了不同的组合,但这似乎都不起作用。

opengl glsl shader sfml depth-buffer
1个回答
1
投票

片段的深度在片段着色器中明确设置:

gl_FragDepth = location.z / 1000;

深度缓冲区可以代表[0.0,1.0]范围内的值,并且深度缓冲区的准确性受到限制。在您的情况下,深度缓冲区具有24位(settings.depthBits = 24;)。如果值超出此范围,或者值之间的差异太小而无法用深度缓冲区的精度来表示,那么深度测试将无法正常进行。

无论如何,顶点着色器不会写入输出变量location。因此,对于所有片段,location.z均为0.0。


如果要将深度值映射到[0.0,1.0]的子范围,则可以使用glDepthRange指定映射。

© www.soinside.com 2019 - 2024. All rights reserved.