c++ - 当我的相机远离物体时,为什么 OpenGL 会剔除我的多边形?

标签 c++ opengl

我正在使用片段着色器对从 OBJ 文件加载的对象进行 Lambert 和 Fog 着色,但多边形存在一个小问题。当我将相机位置从对象移开时,网格中的一些多边形被“剔除”。

例子:

老实说,我不知道为什么会发生这种情况,也不知道为什么只有当我离开物体时才会发生这种情况。这是我的着色器:

顶点着色器

# version 400

out struct vData {
    vec4 pos;
    vec4 texcoord;
    vec3 normal;
} fdata;

void main() {
    fdata.texcoord = gl_MultiTexCoord0;
    fdata.normal = normalize(gl_NormalMatrix * gl_Normal);
    fdata.pos = gl_Vertex;
    gl_Position = gl_ModelViewProjectionMatrix * fdata.pos;
}

片段着色器

# version 400

layout(binding=0) uniform sampler2D mainTexture;
uniform vec4 lightColor;
uniform vec4 lightPos;

in struct vData {
    vec4 pos;
    vec4 texcoord;
    vec3 normal;
} fdata;

vec4 ComputeLambert(const in vec3 lightdir, const in vec4 lightColor, const in vec3 normal, const in vec4 diffuse) {
    float nDotL = dot(normal, lightdir);
    return diffuse * lightColor * max(nDotL, 0.0);
}

float ComputeFogFactor(const in vec4 coord, const in float density) {
    const float LOG2 = 1.442695;
    float z = coord.z / coord.w;
    float fogFactor = exp2( -density * density * z * z * LOG2 );
    return clamp(fogFactor, 0.0, 1.0);
}

void main() {
    vec3 mypos = fdata.pos.xyz / fdata.pos.w;
    vec3 lightdir = lightPos.xyz / lightPos.w;
    vec3 direction = normalize(lightdir - mypos);

    vec4 diffuse = texture2D(mainTexture, fdata.texcoord.st);
    diffuse = ComputeLambert(direction,lightColor, fdata.normal, diffuse);

    float fogFactor = ComputeFogFactor(gl_FragCoord,gl_Fog.density);

    vec4 finalcolor = mix(gl_Fog.color, diffuse, fogFactor);
    //vec4 finalcolor = vec4(1.0,1.0,1.0,1.0);
    finalcolor.a = 1.0;
    gl_FragColor = finalcolor;
}

我确保在调用绘图之前禁用面部剔除,因此我非常确定这不是问题所在。有人知道我能做些什么吗?

最佳答案

据我所知,深度缓冲区值不是线性的,因此多边形离相机越远,为某些深度范围提供的位就越少,从而导致 z-fighting。当您选择视锥体的远平面非常远时(如您所说:地形大小的两倍),这个问题会变得更糟。

因此尝试减小视锥体大小(长度)和/或增加 z 缓冲区深度

关于c++ - 当我的相机远离物体时,为什么 OpenGL 会剔除我的多边形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19901083/

相关文章:

c++ - OpenGL:帧缓冲区,不完整的纹理附件

java - openGL/JOGL : Why do some Textures render "Smoothed" and some not?

opengl - 点画图案的片段着色器

c++ - 是否有一种惯用的方法来限制 shared_ptr::reset 的使用

c++ - 如何复制已经打开的文件?

c++ - 升级到较新版本后 boost fusion/mpl 问题

c++ - 斐波那契数列

c++ - 警告 C4316 : object allocated on the heap may not be aligned 16

OpenGL:尽管透明度设置为 1.0,但仍能看到对象的内部

c++ - 离屏渲染(使用 FBO 和 RenderBuffer)以及颜色、深度、模板的像素传输