2016-11-18 3 views
0

Вот весь мой фрагмент кода шейдера, это довольно просто:OpenGL ES 2.0 Shader Float Data Precision

precision highp float; 

void main(void) 
{ 
    float a = 66061311.0; 
    if(a == 66061312.0) 
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
    else 
    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); 
} 

Почему экран ясно красный. Когда я установил значение 66061315.0, на экране будет ясно зеленое. Это меня смущает. По моему мнению, 66061311.0 находится в пределах диапазона типа float.

Как я могу исправить или обойти это?

+0

FIrst, не отправляйте код как изображения. Просто вставьте его правильно в свой вопрос. Во-вторых, мы не знаем, какие значения имеют элементы «color». Во-вторых, мы не знаем, с какой точностью объявлен ваш float. Если вы выбрали 'precision mediump float;', то ваш представляемый целочисленный диапазон будет минимально '[-2^15, 2^15 -1]', что, конечно, меньше вашего левого операнда. – thokra

+0

Извините, я изменил вопрос. Я использую высокую точность. Но результат все тот же, что и раньше. Я попробовал на ПК и Android Mobile Phone с ARM Mali GPU, результаты остались прежними. –

ответ

1

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

В вашем случае для стандартного 32-битных float результаты:

66061311.0 = 6.60613e+07 
66061312.0 = 6.60613e+07 

И значения одинаковы при сравнении. Это не связано или не связано с openGL или шейдерами, так определяется float. Однако 64-разрядный float обнаружит разницу.

Чтобы добавить немного больше информации, если вы проверите definition of a floating value, вы увидите, что фракция содержит только 23 бита, что означает, что точность составляет до 8,4 М, но у вас более 66 М.

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