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;
}
描画呼び出しの前に Face Culling を無効にしたことを確認したので、それが問題ではないことは確かです。これについて私にできることがあるかどうか誰か知っていますか?