我有一个简单的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);
}
但是通过这种方式获得的图像看起来像这样:
任何人都可以知道是什么问题吗?
我试图弄清楚深度测试出了什么问题,尝试了不同的组合,但这一切似乎都不起作用。
答案 0 :(得分:1)
片段深度在片段着色器中明确设置:
gl_FragDepth = location.z / 1000;
深度缓冲区可以表示[0.0,1.0]范围内的值,并且深度缓冲区的精度受到限制。在您的情况下,深度缓冲区具有24位(settings.depthBits = 24;
)。
如果值超出此范围或值之间的差异太小以致无法用深度缓冲区的精度来表示,那么深度测试将无法正常工作。
无论如何,顶点着色器不会写入输出变量location
。因此,location.z
对于所有片段都是0.0。
如果要将深度值映射到[0.0,1.0]的子范围,则可以使用glDepthRange
指定映射。