2015-07-20 2 views
1

Я использую WebGL и пользовательские шейдеры. В шейдере фрагмента мне нужно сделать некоторую точную математику с целым числом, чтобы индексировать текстурированную текстуру.Неверная целая математика в шейдерах WebGL

Однако, как представляется, для некоторых значений, например, возникают ошибки округления. на Ipad 4. Делаются ли целые операции с точки зрения поплавков?

Как доказательство концепции, я попытался следующий шейдер:

const int eleven = int(11.0); 

highp float f(const int nr11) 
{ 
    if (int(nr11/nr11) != 1) 
     return 1.0; 
    return 0.0; 
} 

void main() 
{ 
    gl_FragColor = vec4(f(eleven)); 
} 

Here является работоспособной ссылкой.

Шейдер производит черный фон на моем рабочем столе, но белый один на мой IPad. Может кто-нибудь объяснить мне, что происходит?

Благодаря

ответ

1

Это правильно, WebGL использует GLSL 1.00 шейдеров, которые не требуются для реализации реальных чисел.

Вы можете прочитать об этом на странице 19: https://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf

Вы не гарантируетесь истинная целочисленная поддержка в WebGL на некоторое время.

+1

Кроме того, GLSL ES 3.0 (который поддерживает целочисленную поддержку) доступен только как часть OpenGL ES 3.0, для чего требуется аппаратная поддержка. Таким образом, даже когда WebGL 2 (на основе GLES 3.x) появляется, вы, вероятно, не сможете использовать новые функции шейдера, такие как целые числа на устройствах, таких как iPad 4, которые не поддерживают ES3. (поддержка устройств iOS для ES3 такая же, как для Metal: для этого требуется хотя бы A7 GPU). – rickster

Смежные вопросы