OpenGL ES 2.0.GLSL - нельзя использовать два сэмплированных цвета одновременно во фрагментном шейдере - PullRequest
2 голосов
/ 02 сентября 2011

Я даже не знаю, как описать эту проблему, поэтому я попытаюсь объяснить с помощью кода. У меня есть фрагментный шейдер, который выполняет отображение параллакса и вычисления освещения. Мне удалось отследить проблему до выборки текстур и / или вычислений освещения, поэтому я буду только публиковать код для этого, чтобы он был коротким:

// 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(ambient.rgb, 1.0);

или

gl_FragColor = vec4(albedo.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);

ambient выбирается из карты куба, а альбедо - из 2D текстуры. У меня есть другие пробоотборники для внешней окклюзии и нормального картирования, и они работают, и они также работают в сочетании с окружающим ИЛИ альбедо. Так работает ambient + ao и работает albedo + ao.

Итак, это моя проблема, и я не могу понять, что ее вызывает. Как я уже сказал, у меня тот же код в другом шейдере, и этот работает.

Стоит отметить, что он работает на эмуляторе PowerVR для OpenGL ES 2.0. а графический процессор - это nVidia GT220. Также не стесняйтесь указывать на другие ошибки в моем коде, такие как неэффективные вещи. А при необходимости выложу полный фрагмент кода шейдера. Извините за длинный пост: P

решаемые

Ух ты, не могу поверить, что причина была настолько глупой, но я полностью пропустил это. По сути, я забыл загрузить кубическую карту для этой конкретной модели, и она не была отправлена ​​в шейдер. Тем не менее, как, черт возьми, он пробовал что-то в первую очередь? Я имею в виду, это работало отдельно, так что же сделал образец единицы текстуры? Кубическая карта, оставленная в кеше от предыдущей обработки?

1 Ответ

0 голосов
/ 05 сентября 2011

Тем не менее, как, черт возьми, он вообще что-то пробовал?

Обычно, когда мои шейдеры не дают желаемого результата, но выглядят раздражающе «нормальными», это происходит потому, что компиляция шейдера отбросила его (я где-то допустил ошибку) и решила использовать «фиксированный конвейер».'шейдер вместо ...

...