length() в ошибке GLSL на Samsung Galaxy S3

Я сделал шейдер на GLSL для игры на Android. В этом шейдере я должен вычислить длину между текущим пикселем и центром FX.

Этот шейдер содержит следующие строки:

//compute distance between current pixel and the center of the fx
highp vec2 tc = MCPosition - center;
int dist = int(length(tc));

if (length(tc) < 720.)
{
    ...

MCPosition — это highp vec2, который содержит координату текущего пикселя. center — это highp vec2, который содержит центр FX

Этот шейдер хорошо работает на многих устройствах (Galaxy Nexus, kindle fire, ...), но на Samsung Galaxy S3 length(tc) возвращает неверное значение, когда ожидаемый результат превышает 256, например, если он управляет всеми значениями с плавающей запятой как mediump.

Может кто-нибудь объяснить мне, почему?


person Klem    schedule 19.06.2013    source источник


Ответы (1)


Galaxy S3 использует графический процессор Mali 400. К сожалению, фрагментные шейдеры на этих графических процессорах поддерживают только точность lowp и mediump во фрагментном шейдере. Хотя ожидаемый результат length(tc) меньше максимального значения для числа с плавающей запятой среднего размера, промежуточные результаты будут больше.

Возможно, вы могли бы масштабировать свой вектор, прежде чем найти его длину:

if (length((1./720.)*tc) < 1.)
{
  ...
person GuyRT    schedule 19.06.2013