이 문제를 설명하는 방법을 모르겠으므로 코드로 설명하려고합니다. 시차 매핑 및 조명 계산을 수행하는 조각 쉐이더가 있습니다. 나는 단지 코드를 게시 할 수 있습니다 그래서 짧은 그것을 유지하는 텍스처 및/또는 조명 계산의 샘플링에 문제를 추적 관리했습니다 :OpenGL ES 2.0. GLSL - 프래그먼트 셰이더에서 동시에 두 개의 샘플 색상을 사용할 수 없습니다.
// sample maps
vec3 albedo = texture2D(u_albedo_texture_1, p_texc).rgb;
vec3 ao = texture2D(u_ambientocclusion_texture, v_texcoord).rgb - 0.5; // ambient occlusion
vec3 normalT = texture2D(u_normalmap_texture, p_texc).rgb * 2.0 - 1.0; // tangent space normal
vec4 normalW = vec4(normalize(TBN * normalT).xyz, 1.0); // world space normal
vec3 color = vec3(0.0);
vec3 ambient = textureCube(u_cubemap_texture, -normalW.xyz).rgb; // get ambient lighting from cubemap
color += ambient * ao;
float d = length(light_vector);
float atten = 1.0/dot(light_attenuation, vec3(1.0, d, d * d)); // compute attenuation of point light
// diffuse term
float ndotl = max(dot(normalW.xyz, light_vector), 0.0);
color += atten * ndotl * light_diffuse.rgb * albedo;
// specular term
float hdotn = max(0.0, dot(half_vector, normalW.xyz));
color += atten * ((shininess + 8.0)/8.0 * 3.1416) * light_specular.rgb * p_ks * pow(hdotn, shininess);
gl_FragColor = vec4(color.rgb, 1.0);
나는 다른 쉐이더에서 작업이 코드를 가지고 있지만, 여기 시차 맵핑 쉐이더에서는 픽셀을 그냥 버리고 그 이유를 이해할 수 없습니다. 따라서 객체를 표시하는 대신 픽셀을 버리고 객체가 전혀 표시되지 않습니다. 틀린 색깔이나 지저분한 색깔, 아무것도.
나는 그 문제를 알베도와 주변 샘플링 된 색으로 추적 할 수 있었다. 둘 다 정확하게 샘플링됩니다. 내가
gl_FragColor = vec4(albedo.rgb, 1.0);
gl_FragColor = vec4(ambient.rgb, 1.0);
또는
을 인쇄 할 경우 둘 다 제대로 표시 얻을하지만 난 두 색상으로 뭔가를하려고하면, 픽셀은 폐기 얻을. 다음 작업 중 하나도 해당하지 않습니다.gl_FragColor = vec4(ambient + albedo, 1.0);
gl_FragColor = vec4(ambient * albedo, 1.0);
gl_FragColor = vec4(ambient.r, albedo.g, ambient.b, 1.0);
앰비언트는 2D 텍스처에서 큐브 맵과 알베도로부터 샘플링됩니다. 앰비언트 오 클루 전 (Ambient Occlusion)과 노말 맵핑 (Normal Map)을위한 다른 샘플러가 있으며, 그것들은 앰비언스 OR 알베도와 함께 작동합니다. ambient + ao가 작동하고 albedo + ao가 작동합니다.
그래서 내 문제이며 그 원인을 파악할 수 없습니다. 내가 말했듯이, 나는 다른 셰이더에 같은 코드를 가지고 있으며 하나는 작동합니다.
언급 할만한 가치는 OpenGL ES 2.0 용 PowerVR 에뮬레이터에서 실행됩니다. GPU는 nVidia GT220입니다. 또한 비효율적 인 것들처럼 내 코드에서 다른 실수를 지적하십시오. 그리고 필요한 경우 전체 프래그먼트 쉐이더 코드를 게시 할 것입니다. 긴 게시물에 대한 죄송합니다 : P
은 원인이 너무 바보 믿을 수 없어,
와우를 해결했다,하지만 난 완전히 놓쳤다. 기본적으로 특정 모델의 큐브 맵을로드하는 것을 잊었으며 셰이더로 전송되지 않았습니다. 아직도, 도대체 어떻게 그것을 처음부터 샘플링 했습니까? 내 말은, 그것은 따로 작동하고 있었기 때문에 텍스쳐 유닛은 무엇을 샘플 했는가? 이전 처리에서 캐시에 남아있는 큐브 맵?
쉐이더에서 텍스처의 수에 대한 구현 제한을 두드리고있는 경우와 앰비언트 * 또는 * 알베도 (둘 다 사용하지 않는 경우) 중 하나를 사용하는 경우 그래서 문제가되지 않습니다. – Flexo