2011-03-20 35 views
42

¿La variable con la que está rellenando valores determina la precisión con la que está trabajando, a la derecha del signo de igual?En OpenGL ES 2.0/GLSL, ¿dónde necesita especificadores de precisión?

Por ejemplo, ¿hay alguna diferencia, de sentido, al especificador de precisión aquí:

gl_FragColor = lowp vec4(1); 

He aquí otro ejemplo:

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

Y si se toma algunos flotadores, y crear un vector o matriz de ellos, ¿ese vector o matriz tomará la precisión de los valores con los que lo rellena, o esos valores se transformarán en otro nivel de precisión?

creo que la optimización de esto sería mejor responder a la pregunta:

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

quiero decir, ¿Tiene que ir tan lejos, si quieres que lo más rápido posible, o es parte de ella inútil?

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

Sé que puede definir la precisión predeterminada para float, y que supuestamente se usa para vectores y matrices posteriormente. Supongamos por el propósito de la educación, que habíamos definido previamente esta:

precision highp float; 

Respuesta

60
  1. No es necesario especificadores de precisión de las constantes literales/desde los que obtener el tiempo de compilación evaluado a lo que están siendo asignados. Además, dado que la precisión de gl_FragColor ya está definida en función de la profundidad del objetivo de renderizado, la precisión que le asigne no debería importar.

  2. En sombreadores de vértices, las siguientes precisiones son declarados por defecto: (4.5.3 Default Precision Qualifiers)

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

    Y en los sombreadores de fragmentos que se obtiene:

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

    Esto significa que si se declara un flotador en un sombreador de fragmentos, debe decir si es lowp o mediump. Las precisiones predeterminadas de float/int también se extienden a matrices/vectores.

  3. highp solo se admite en sistemas que tienen la macro GL_FRAGMENT_PRECISION_HIGH definida como 1; en el resto obtendrá un error de compilación. (4.5.4 Available Precision Qualifiers)

  4. La regla para la precisión en una expresión es que se convierten automáticamente al tipo de asignación/parámetro al que están vinculados. Entonces para su punto, usaría la precisión de los tipos de entrada por defecto y los lowp's adicionales son innecesarios (y sintácticamente incorrectos). Si desea lanzar un tipo a una precisión menor, la única forma de hacerlo es asignarlo explícitamente a una precisión menor.

Estas respuestas son todas de la especificación GLSL de Khronos, que usted puede encontrar aquí (las secciones relevantes son 4.5.2 y 4.5.3): http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf

+5

"Además, dado que la precisión de gl_FragColor ya está definida en función de la profundidad del objetivo de renderizado" ¿cuál es su fuente para esta afirmación? No veo ninguna información sobre esto en la especificación. – eodabash