Я вижу странное поведение, которое не могу объяснить в шейдере WebGL, который я написал. Для меня это не область знаний, поэтому вполне возможно, что я неправильно понимаю что-то довольно простое, но я не уверен, что именно.
У меня есть кодовая ручка, иллюстрирующая странное поведение здесь https://codepen.io/bjvanminnen/pen/XqMpvL.
void main () {
vec3 color = vec3(0.);
vec2 loc1 = vec2(0.5, 0.) / u_res;
vec2 loc2 = vec2(1.5, 0.) / u_res;
float val1 = texture2D(u_tex, loc1).r * 255.;
float val2 = texture2D(u_tex, loc1).r * 255.;
color.r = val1 == val2 ? 1. : 0.;
// commenting/uncommenting this line somehow affects the b value
// on iOS, when uncommented we end up with (53, 0, 255, 255)
// when commented we end up with (255, 0, 0, 255)
// I can think of no reason why the below line should affect color.b
color.r = floor(val1) / 255.;
color.b = val1 == 53. ? 1. : 0.;
gl_FragColor = vec4(color, 1.);
}
Краткое изложение того, что происходит
В JS я создаю текстуру, где каждый пиксель имеет вид # 350000
В моем фрагментном шейдере прочитайте первые два пикселя
Первоначально установить значение r на выходе равным 1, если два пикселя идентичны (они должны быть)
При отсутствии комментариев измените значение color.r на основании минимального значения val1 (шаг, который я не ожидал бы повлиять на color.b)
Установите значение b на выходе равным 1, если значение пикселя равно 53 (то есть 0x35).
Затем я проверяю полученные значения пикселей в JS.
Мои ожидания:
Когда вторая строка color.r
закомментирована, я ожидаю результат (53, 0, 255, 255). Это то, что я вижу на своем рабочем столе, но на моем устройстве iOS я вижу (53, 0, 0, 255). Похоже, что в iOS значение val1 немного больше 53. Я предполагаю, что это просто странность с плавающей точкой.
Что очень странно, и я не могу понять, что когда я закомментирую вторую строку color.r
, я получаю (255, 0, 255, 255) на своем рабочем столе - что имеет смысл - но (255, 0, 0, 255) на моем устройстве iOS.
Другими словами, наличие / отсутствие строки color.r = floor(val1) / 255.;
как-то меняет результат color.b
.
Сталкивался ли я с какой-то странной ошибкой iOS, или я что-то здесь неправильно понимаю?