Подтвердить что ты не робот

В OpenGL ES 2.0/GLSL, где вам нужны спецификаторы точности?

Значит ли переменная, что вы набиваете значения, определять, с какой точностью вы работаете, справа от знака равенства?

Например, существует ли какая-либо разница в смысле спецификатора точности здесь:

gl_FragColor = lowp vec4(1);

Вот еще один пример:

lowp float floaty = 1. * 2.;
floaty = lowp 1. * lowp 2.;

И если вы берете некоторые поплавки и создаете из них вектор или матрицу, будет ли этот вектор или матрица получать точность значений, которые вы им нанесли, или эти значения преобразуются в другой уровень точности?

Я думаю, что оптимизация этого лучше всего ответит на вопрос:

dot(gl_LightSource[0].position.xyz, gl_NormalMatrix * gl_Normal)

Я имею в виду, нужно ли это зайти так далеко, если вы хотите, чтобы это было как можно быстрее или что-то из этого бесполезно?

lowp dot(lowp gl_LightSource[0].position.xyz, lowp gl_NormalMatrix * lowp gl_Normal)

Я знаю, что вы можете определить точность по умолчанию для float и что это предположительно используется для векторов и матриц впоследствии. Предположим, что с целью обучения мы определили это ранее:

precision highp float;
4b9b3361

Ответ 1

  • Вам не нужны спецификаторы точности для констант/литералов, так как они получают время компиляции для того, что им назначено. Более того, поскольку точность gl_FragColor уже определена на основе глубины цели рендеринга, точность, которую вы ему назначаете, не имеет значения.

  • В вершинных шейдерах по умолчанию объявляются следующие префиксы: (4.5.3 Default Precision Qualifiers)

    precision highp float;
    precision highp int;
    precision lowp sampler2D;
    precision lowp samplerCube;
    

    А в флеш-шейдерах вы получаете:

    precision mediump int;
    precision lowp sampler2D;
    precision lowp samplerCube;
    

    Это означает, что если вы объявляете float в шейдере фрагментов, вы должны сказать, является ли это lowp или mediump. Исключения по умолчанию float/int также распространяются на матрицы/векторы.

  • highp поддерживается только для систем, у которых макрос GL_FRAGMENT_PRECISION_HIGH определяется 1; в остальном вы получите ошибку компилятора. (4.5.4 Available Precision Qualifiers)

  • Правило точности в выражении состоит в том, что они автоматически передаются в тип привязки/параметра, к которому они привязаны. Таким образом, для вашей точки она будет использовать точность входных типов по умолчанию, а дополнительные lowp не нужны (и синтаксически неверны). Если вы хотите понизить тип до более низкой точности, единственный способ сделать это - явно назначить его более низкой точности.

Эти ответы взяты из спецификации Hronos GLSL, которую вы можете найти здесь (соответствующие разделы: 4.5.2 и 4.5.3): http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf p >