2011-09-02 3 views
2

이 문제를 설명하는 방법을 모르겠으므로 코드로 설명하려고합니다. 시차 매핑 및 조명 계산을 수행하는 조각 쉐이더가 있습니다. 나는 단지 코드를 게시 할 수 있습니다 그래서 짧은 그것을 유지하는 텍스처 및/또는 조명 계산의 샘플링에 문제를 추적 관리했습니다 :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

은 원인이 너무 바보 믿을 수 없어,

와우를 해결했다,하지만 난 완전히 놓쳤다. 기본적으로 특정 모델의 큐브 맵을로드하는 것을 잊었으며 셰이더로 전송되지 않았습니다. 아직도, 도대체 어떻게 그것을 처음부터 샘플링 했습니까? 내 말은, 그것은 따로 작동하고 있었기 때문에 텍스쳐 유닛은 무엇을 샘플 했는가? 이전 처리에서 캐시에 남아있는 큐브 맵?

+0

쉐이더에서 텍스처의 수에 대한 구현 제한을 두드리고있는 경우와 앰비언트 * 또는 * 알베도 (둘 다 사용하지 않는 경우) 중 하나를 사용하는 경우 그래서 문제가되지 않습니다. – Flexo

답변

0

그래도 대체 어떻게 그 샘플을 처음 샘플링 했습니까? 내 쉐이더가 원하는 결과를 생성하지 않고 귀찮게 '정상'을 찾고 있습니다 보통

쉐이더 컴파일 (I 어딘가에 오류가 만든)를 삭제하고 대신 '고정 파이프 라인'쉐이더를 사용하기로 결정 때문이다 ...