W OpenGL ES 2.0 / GLSL, gdzie potrzebujesz precyzyjnych specyfikacji?

Czy zmienna, w którą wpychasz wartości, dyktuje precyzję, z jaką pracujesz, po prawej stronie znaku równości?

Na przykład, czy jest tu jakaś różnica znaczeniowa w stosunku do precyzji:

gl_FragColor = lowp vec4(1);

Oto kolejny przykład:

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

I jeśli weźmiesz kilka pływaków i stworzysz z nich wektor lub macierz, to czy ten wektor lub macierz przyjmie precyzję wartości, z których je wypychasz, czy te wartości przekształcą się w inną precyzję poziom?

Myślę, że optymalizacja tego najlepiej odpowie na pytanie:

dot(gl_LightSource[0].position.xyz, gl_NormalMatrix * gl_Normal)
To znaczy, czy to musi zajść tak daleko, jeśli chcesz to tak szybko, jak to możliwe, czy część z nich jest bezużyteczna?
lowp dot(lowp gl_LightSource[0].position.xyz, lowp gl_NormalMatrix * lowp gl_Normal)

Wiem, że można zdefiniować domyślną precyzję dla float ' a, i że to podobno jest później używane dla wektorów i macierzy. Załóżmy dla celów edukacyjnych, że zdefiniowaliśmy to wcześniej:

precision highp float;
Author: Jessy, 2011-03-20

1 answers

  1. Nie potrzebujesz precyzyjnych określeń na stałych/literałach, ponieważ te dostają czas kompilacji oceniany do tego, do czego są przypisane. Co więcej, ponieważ precyzja gl_FragColor jest już zdefiniowana na podstawie głębi celu renderowania, dokładność przypisana do niego nie powinna mieć znaczenia.

  2. W shaderach wierzchołków domyślnie deklarowane są następujące precisions: (4.5.3 Default Precision Qualifiers)

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

    A w shaderach fragment otrzymujesz:

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

    Oznacza to, że jeśli deklarujesz float w cieniowaniu fragmentów, musisz powiedzieć, czy jest to lowp czy mediump. Default float/int precisions rozciągają się także na macierze/wektory.

  3. highp jest obsługiwane tylko w systemach, które mają makro GL_FRAGMENT_PRECISION_HIGH zdefiniowane na 1; w pozostałej części pojawi się błąd kompilatora. (4.5.4 Available Precision Qualifiers)

  4. Regułą precyzji w wyrażeniu jest to, że są one oddane automatycznie do rodzaju przypisania / parametru, z którym są związane. Więc dla Twojej kropki, to domyślnie używa precyzji typów wejściowych, A Dodatkowe lowp są niepotrzebne (i niepoprawne składniowo). Jeśli chcesz obniżyć typ z mniejszą precyzją, jedynym sposobem na to jest wyraźne przypisanie go do niższej precyzji.

Wszystkie odpowiedzi pochodzą ze specyfikacji Khronos GLSL, którą można znaleźć tutaj (odpowiednie sekcje to 4.5.2 i 4.5.3): http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf

 66
Author: Mikola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-12 15:15:22