67 votes

Dans OpenGL ES 2.0 / GLSL, où avez-vous besoin de spécificateurs de précision ?

La variable dans laquelle vous introduisez des valeurs détermine-t-elle la précision avec laquelle vous travaillez, à droite du signe égal ?

Par exemple, y a-t-il une différence, de sens, au spécificateur de précision ici :

gl_FragColor = lowp vec4(1);

Voici un autre exemple :

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

Et si vous prenez des flottants et que vous créez un vecteur ou une matrice à partir de ceux-ci, ce vecteur ou cette matrice aura-t-il la précision des valeurs que vous lui donnez, ou ces valeurs seront-elles transformées en un autre niveau de précision ?

Je pense que l'optimiser répondrait mieux à la question :

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

Je veux dire, est-il nécessaire d'aller aussi loin, si vous voulez que ça aille le plus vite possible, ou est-ce qu'une partie est inutile ?

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

Je sais que vous pouvez définir la précision par défaut pour les flottants, et que cette supposée précision est ensuite utilisée pour les vecteurs et les matrices. Supposons, pour les besoins de l'enseignement, que nous l'ayons déjà définie :

precision highp float;

91voto

Mikola Points 5586
  1. Vous n'avez pas besoin de spécificateurs de précision sur les constantes/littérales puisque celles-ci sont évaluées à la compilation à la valeur à laquelle elles sont assignées.

  2. Dans les vertex shaders, les précisions suivantes sont déclarées par défaut : ( 4.5.3 Default Precision Qualifiers )

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

    Et dans les fragment shaders vous avez :

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

    Cela signifie que si vous déclarez un flottant dans un fragment shader, vous devez préciser si c'est un lowp o un mediump . La valeur par défaut float / int Les précisions s'étendent également aux matrices/vecteurs.

  3. highp n'est pris en charge que sur les systèmes qui disposent de l'option GL_FRAGMENT_PRECISION_HIGH définie pour 1 ; sur le reste, vous obtiendrez une erreur de compilation. ( 4.5.4 Available Precision Qualifiers )

  4. La règle pour la précision dans une expression est qu'elle est automatiquement convertie au type de l'affectation/du paramètre auquel elle est liée. Ainsi, pour votre point, il utiliserait la précision des types d'entrée par défaut et le paramètre supplémentaire lowp sont inutiles (et syntaxiquement incorrectes). Si vous voulez convertir un type en une précision inférieure, la seule façon de le faire est de l'assigner explicitement à une précision inférieure.

Ces réponses sont toutes issues de la spécification GLSL de Khronos, que vous pouvez trouver ici (les sections pertinentes sont 4.5.2 et 4.5.3) : http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf

6 votes

"De plus, puisque la précision de gl_FragColor est déjà définie en fonction de la profondeur de la cible de rendu" quelle est votre source pour cette affirmation ? Je ne vois aucune information à ce sujet dans la spécification.

1 votes

Cette partie de la réponse est incorrecte ; c'est vraiment important. J'ai corrigé le point 1 dans la réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X