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;
1 answers
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.-
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
czymediump
. Defaultfloat
/int
precisions rozciągają się także na macierze/wektory. highp
jest obsługiwane tylko w systemach, które mają makroGL_FRAGMENT_PRECISION_HIGH
zdefiniowane na1
; w pozostałej części pojawi się błąd kompilatora. (4.5.4 Available Precision Qualifiers
)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
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