【问题标题】:Problems with depth testing深度测试的问题
【发布时间】:2020-06-13 14:50:36
【问题描述】:

我有一个简单的 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);
}

但是我这样做时得到的图像是这样的:

谁能告诉我是什么问题?

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

【问题讨论】:

  • 因为太长了。
  • 为什么要显式更改片段深度(gl_FragDepth = location.z / 1000;)?请注意,深度缓冲区的准确性是有限的。去掉这条线还能用吗?
  • 嗯.. 它似乎工作.. 但问题是,为什么它不工作,即使我只是做gl_FragDepth = location.z; 我需要稍后写入深度缓冲区。
  • 可能值不在 [0.0, 1.0] 范围内。为什么要更改深度缓冲区中的值?
  • 无论如何,顶点着色器不会写入位置。对于所有片段,location.z 为 0。

标签: opengl glsl shader sfml depth-buffer


【解决方案1】:

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

gl_FragDepth = location.z / 1000;

深度缓冲区可以表示 [0.0, 1.0] 范围内的值,并且深度缓冲区的准确性是有限的。在您的情况下,深度缓冲区有 24 位 (settings.depthBits = 24;)。
如果值在这个范围之外,或者值之间的差异很小,无法用深度缓冲区的精度来表示,那么深度测试将无法正常工作。

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 2021-05-19
    • 2012-01-12
    • 1970-01-01
    • 2011-09-16
    • 2011-04-24
    • 1970-01-01
    相关资源
    最近更新 更多