深度测试的问题
Problems with depth testing
我有一个简单的 OpenGL 应用程序,我想绘制一个立方体,但似乎深度缓冲区工作不正常。我将 SFML 用于 windowin 系统,将 GLEW 用作库。
主要如下所示:https://pastebin.com/tq5t0TJN
...code...
网格 class 如下所示: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;
深度缓冲区可以表示[0.0, 1.0]范围内的值,深度缓冲区的精度有限。在您的情况下,深度缓冲区有 24 位(settings.depthBits = 24;
)。
如果值超出这个范围或者值之间的差异太小以至于无法用深度缓冲区的精度表示,那么深度测试将无法正常工作。
无论如何,顶点着色器不会写入输出变量location
。因此 location.z
对于所有片段都是 0.0。
如果要将深度值映射到 [0.0, 1.0] 的子范围内,则可以使用 glDepthRange
指定映射。
我有一个简单的 OpenGL 应用程序,我想绘制一个立方体,但似乎深度缓冲区工作不正常。我将 SFML 用于 windowin 系统,将 GLEW 用作库。
主要如下所示:https://pastebin.com/tq5t0TJN
...code...
网格 class 如下所示: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;
深度缓冲区可以表示[0.0, 1.0]范围内的值,深度缓冲区的精度有限。在您的情况下,深度缓冲区有 24 位(settings.depthBits = 24;
)。
如果值超出这个范围或者值之间的差异太小以至于无法用深度缓冲区的精度表示,那么深度测试将无法正常工作。
无论如何,顶点着色器不会写入输出变量location
。因此 location.z
对于所有片段都是 0.0。
如果要将深度值映射到 [0.0, 1.0] 的子范围内,则可以使用 glDepthRange
指定映射。