Share via


RuntimeShader Clase

Definición

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

[Android.Runtime.Register("android/graphics/RuntimeShader", ApiSince=33, DoNotGenerateAcw=true)]
public class RuntimeShader : Android.Graphics.Shader
[<Android.Runtime.Register("android/graphics/RuntimeShader", ApiSince=33, DoNotGenerateAcw=true)>]
type RuntimeShader = class
    inherit Shader
Herencia
RuntimeShader
Atributos

Comentarios

RuntimeShader Un calcula un color por píxel basado en la salida de una función definida por el usuario del lenguaje de sombreado de gráficos android (AGSL).

<h3>Android Graphics Shading Language</h3>

La sintaxis de AGSL es muy similar al lenguaje de sombreado de OpenGL ES, pero hay algunas diferencias importantes que se resaltan aquí. La mayoría de estas diferencias se resumen en un hecho básico: <b>Con lenguajes de sombreado de GPU, está programando una fase de la canalización de GPU. Con AGSL, va a programar una fase de la Canvas canalización de dibujo o RenderNode .</B>

En concreto, un sombreador de fragmentos GLSL controla todo el comportamiento de la GPU entre el rasterizador y el hardware de mezcla. Ese sombreador realiza todo el trabajo para calcular un color y el color que genera es exactamente lo que se alimenta a la fase de fusión de la canalización.

En cambio, las funciones AGSL existen como parte de una canalización más grande. Cuando se emite una Canvas operación de dibujo, Android (generalmente) ensambla un único sombreador de fragmentos de GPU para realizar todo el trabajo necesario. Este sombreador suele incluir varias piezas. Por ejemplo, podría incluir:

<ul><li>Evaluación de si un píxel cae dentro o fuera de la forma que se dibuja (o en el borde, donde podría aplicar suavizado).</li li><>Evaluación de si un píxel está dentro o fuera de la región de recorte (de nuevo, con posible lógica antialiasing para píxeles de borde).<Lógica /li><li>para , ShaderColorFiltery BlendMode en .Paint</li li><>Código de conversión del espacio de color, como parte de la administración de colores de Android.</li></ul>

Un RuntimeShader, al igual que otros Shader tipos, contribuye eficazmente a una función al sombreador de fragmentos de la GPU.

<h3>Ejecución del sombreador< AGSL/h3>

Al igual que un sombreador GLSL, un sombreador AGSL comienza la ejecución en una función principal. A diferencia de GLSL, la función recibe como parámetro de entrada la posición del píxel dentro del Canvas espacio de coordenadas ( RenderNode similar a gl_fragCoord) y devuelve el color que se sombrea como un vec4 (similar al color vec4 o gl_FragColor en GLSL).

vec4 main(vec2 canvas_coordinates);

AGSL y GLSL usan diferentes espacios de coordenadas de forma predeterminada. En GLSL, la coordenada de fragmento (fragCoord) es relativa a la parte inferior izquierda. AGSL coincide con el sistema de coordenadas de pantalla de Android Canvas que tiene su origen como la esquina superior izquierda. Esto significa que las coordenadas proporcionadas como parámetro en la función principal son locales para el lienzo con la excepción de las Shader#getLocalMatrix(Matrix) transformaciones aplicadas a este sombreador. Además, si otro sombreador se invoca mediante #setInputShader(String, Shader), ese sombreador primario puede modificar arbitrariamente las coordenadas de entrada.

<h3>AGSL y Espacios< de color/h3>

Los gráficos android y por extensión se administran RuntimeShader en color. El funcionamiento ColorSpace de un sombreador AGSL se define para que sea el espacio de color del destino, que en la mayoría de los casos viene determinado por Window#setColorMode(int).

Al crear un sombreador AGSL, no sabrá cuál es el espacio de color de trabajo. Para muchos efectos, esto es correcto porque, de forma predeterminada, las entradas de color se convierten automáticamente en el espacio de color de trabajo. Para ciertos efectos, puede ser importante realizar algunas matemáticas en un espacio de colores fijo conocido. Un ejemplo común es la iluminación: para obtener iluminación físicamente precisa, las matemáticas deben realizarse en un espacio de colores lineal. Para ayudar con esto, AGSL proporciona dos funciones intrínsecas que convierten colores entre el espacio de colores de trabajo y el ColorSpace.Named#LINEAR_EXTENDED_SRGB espacio de colores:

vec3 toLinearSrgb(vec3 color);
            vec3 fromLinearSrgb(vec3 color);

<h3>AGSL y Alfa</h3 premultiplicado>

Cuando se trabaja con colores transparentes, hay dos representaciones posibles (comunes): alfa (sin asociar) y alfa premultiplicado (asociado). En ASGL, se espera que el color devuelto por la función principal esté premultiplido. El uso de AGSL del alfa premultiplicado implica:

<ul><li>Si el sombreador AGSL devolverá colores transparentes, asegúrese de multiplicar el RGB por A. El color resultante debe ser [R*A, G*A, B*A, A], no [R, G, B, A].</li li><>Para sombreadores más complejos, debe comprender cuáles de sus colores están premultiplidos frente a rectos. Muchas operaciones no tienen sentido si mezcla ambos tipos de color juntos.</li></ul>

<h3>Uniforms</h3>

AGSL, como GLSL, expone el concepto de uniformes. Un uniforme de AGSL se define como una variable global de solo lectura a la que puede acceder el código AGSL y se inicializa mediante varios métodos establecedores en RuntimeShader. AGSL expone dos tipos de datos uniformes primitivos (float, int) y dos tipos especializados (colores, sombreadores) que se describen a continuación.

<h4>Uniforms primitivos</h4>

Hay dos tipos uniformes primitivos admitidos por AGSL, float e int. Para estos tipos y uniformes que representan una agrupación de estos tipos, como matrices y matrices, hay métodos correspondientes RuntimeShader para inicializarlos. <table border="2" width="85%" align="center" cellpadding="5">thead<>tr>><th Java Type/th><>AGSL Type<</th th Method/th/<th<>><>/tr<>/thead<>

<tbody><tr><td rowspan="4">Floats</td td><>float</td td<>RuntimeShader#setFloatUniform(String, float)></td></tr<<>>tr td>vec2</td td<>RuntimeShader#setFloatUniform(String, float, float)/td><></tr tr<>><td>vec3</td><td>RuntimeShader#setFloatUniform(String, float, float, float)</td/td>< tr td>>><<vec4</td td<RuntimeShader#setFloatUniform(String, float, float, float, float)><>/td<>/tr tr><><td rowspan="4">Integers</td td<>>int</td td<>RuntimeShader#setIntUniform(String, int)<>/td<>/tr tr><<>td>ivec2</td td/td>>>RuntimeShader#setIntUniform(String, int, int)<<</tr td><>><ivec3</td><td<RuntimeShader#setIntUniform(String, int, int, int)>/td/td<> tr><td>><ivec4</td td>RuntimeShader#setIntUniform(String, int, int, int, int)<<>/td></tr><Tr><td rowspan="2">Matrices y Matrices</td td><>mat2, mat3 y mat4, y float[]</td td>>RuntimeShader#setFloatUniform(String, float[])<</tr tr>><<td>>< int[]</td td<>td/td><RuntimeShader#setIntUniform(String, int[])/td></tbody><></table>

Por ejemplo, un sombreador AGSL simple que usa un uniforme float para modular la transparencia del color de salida tendría el siguiente aspecto:

uniform float alpha;
            vec4 main(vec2 canvas_coordinates) {
                vec3 red = vec3(1.0, 0.0, 0.0);
                return vec4(red * alpha, alpha);
            }

Después de crear un RuntimeShader con ese programa, el uniforme se puede inicializar y actualizar por fotograma llamando RuntimeShader#setFloatUniform(String, float) a con el valor alfa. El valor de un valor uniforme primitivo tiene como valor predeterminado 0 si se declara en el sombreador AGSL, pero no se inicializa.

<h4>Uniformes< de color/h4>

AGSL no sabe si las variables uniformes contienen colores, no las convertirá automáticamente en el espacio de colores de trabajo del sombreador en tiempo de ejecución. Sin embargo, puede etiquetar el uniforme vec4 con el calificador "layout(color)", que permite a Android saber que el uniforme se usará como un color. Al hacerlo, AGSL puede transformar el valor uniforme en el espacio de colores de trabajo. En AGSL, declare el uniforme de la siguiente manera:

layout(color) uniform vec4 inputColorA;
            layout(color) uniform vec4 inputColorB;
            vec4 main(vec2 canvas_coordinates) {
                // blend the two colors together and return the resulting color
                return mix(inputColorA, inputColorB, 0.5);
            }

Después de crear un RuntimeShader con ese programa, los uniformes se pueden inicializar y actualizar por fotograma llamando a RuntimeShader#setColorUniform(String, int), RuntimeShader#setColorUniform(String, long)o RuntimeShader#setColorUniform(String, Color) con los colores deseados. El valor de un uniforme de color no está definido si se declara en el sombreador AGSL, pero no se inicializa.

<h4>Shader Uniforms</h4> In GLSL, un sombreador de fragmentos puede muestrear una textura. En el caso de AGSL en lugar de las texturas de muestreo, puede muestrear desde cualquier Shader, que incluye , pero no está limitado a BitmapShader. Para aclarar que está trabajando en un Shader objeto no hay ningún método "sample". En su lugar, el uniforme del sombreador tiene un método "eval()". Esta distinción permite a los sombreadores AGSL muestrear desde los sombreadores de degradado y mapa de bits existentes, así como otros RuntimeShader objetos. En AGSL, declare el uniforme de la siguiente manera:

uniform shader myShader;
            vec4 main(vec2 canvas_coordinates) {
                // swap the red and blue color channels when sampling from myShader
                return myShader.eval(canvas_coordinates).bgra;
            }

Después de crear un RuntimeShader con ese programa, el uniforme del sombreador se puede inicializar y actualizar por fotograma llamando RuntimeShader#setInputShader(String, Shader) a con el sombreador deseado. El valor de un uniforme de sombreador no está definido si se declara en el sombreador AGSL, pero no se inicializa.

Aunque la mayoría BitmapShadercontiene colores que deben administrarse en color, algunos contienen datos que no son realmente colores. Esto incluye mapas de bits que almacenan normales, propiedades de material (por ejemplo, rugosidad), mapas de altura o cualquier otro dato puramente matemático que se almacene en un mapa de bits. Al usar estos tipos de sombreadores en AGSL, es probable que quiera inicializarlos con #setInputBuffer(String, BitmapShader). Los sombreadores inicializados de esta manera funcionan de forma muy similar a una normal BitmapShader (incluido el filtrado y el mosaico), con algunas diferencias principales: <ul><li>No se aplica la transformación de espacio de colores (se omite el espacio de colores del mapa de bits).<Los mapas de bits /li><>li que devuelven false para Bitmap#isPremultiplied() no se premultiplican automáticamente.</li></ul>

Además, cuando se realiza el muestreo de un BitmapShader elemento , tenga en cuenta que el sombreador no usa coordenadas normalizadas (como una textura en GLSL). Usa (0, 0) en la esquina superior izquierda y (ancho, alto) en la esquina inferior derecha. Normalmente, esto es exactamente lo que quieres. Si va a evaluar el sombreador con coordenadas basadas en las que se pasan al programa AGSL, la escala es correcta. Sin embargo, si desea ajustar esas coordenadas (para realizar algún tipo de reasignación del mapa de bits), recuerde que las coordenadas son locales para el lienzo.

Documentación de Java para android.graphics.RuntimeShader.

Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el proyecto de código Project y que se usan según los términos Creative Commons 2.5 Attribution License.

Constructores

RuntimeShader(IntPtr, JniHandleOwnership)

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

RuntimeShader(String)

Crea un nuevo runtimeShader.

Propiedades

Class

Devuelve la clase en tiempo de ejecución de este Objectobjeto .

(Heredado de Object)
Handle

Identificador de la instancia de Android subyacente.

(Heredado de Object)
JniIdentityHashCode

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

(Heredado de Object)
JniPeerMembers

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

PeerReference

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

(Heredado de Object)
ThresholdClass

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

ThresholdType

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

Métodos

Clone()

Crea y devuelve una copia de este objeto.

(Heredado de Object)
Dispose()

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

(Heredado de Object)
Dispose(Boolean)

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

(Heredado de Object)
Equals(Object)

Indica si algún otro objeto es "igual a" este.

(Heredado de Object)
GetHashCode()

Devuelve un valor de código hash del objeto.

(Heredado de Object)
GetLocalMatrix(Matrix)

Devuelve true si el sombreador tiene una matriz local que no es de identidad.

(Heredado de Shader)
JavaFinalize()

Llamado por el recolector de elementos no utilizados en un objeto cuando la recolección de elementos no utilizados determina que no hay más referencias al objeto.

(Heredado de Object)
Notify()

Activa un único subproceso que está esperando en el monitor de este objeto.

(Heredado de Object)
NotifyAll()

Activa todos los subprocesos que están esperando en el monitor de este objeto.

(Heredado de Object)
SetColorUniform(String, Color)

Establece el valor de color uniforme correspondiente a este sombreador.

SetColorUniform(String, ColorObject)

Establece el valor de color uniforme correspondiente a este sombreador.

SetColorUniform(String, Int64)

Establece el valor de color uniforme correspondiente a este sombreador.

SetFloatUniform(String, Single)

Establece el valor uniforme correspondiente a este sombreador.

SetFloatUniform(String, Single, Single)

Establece el valor uniforme correspondiente a este sombreador.

SetFloatUniform(String, Single, Single, Single)

Establece el valor uniforme correspondiente a este sombreador.

SetFloatUniform(String, Single, Single, Single, Single)

Establece el valor uniforme correspondiente a este sombreador.

SetFloatUniform(String, Single[])

Establece el valor uniforme correspondiente a este sombreador.

SetHandle(IntPtr, JniHandleOwnership)

Establece la propiedad Handle.

(Heredado de Object)
SetInputBuffer(String, BitmapShader)

Asigna el sombreador uniforme al parámetro de sombreador proporcionado.

SetInputShader(String, Shader)

Asigna el sombreador uniforme al parámetro de sombreador proporcionado.

SetIntUniform(String, Int32)

Establece el valor uniforme correspondiente a este sombreador.

SetIntUniform(String, Int32, Int32)

Establece el valor uniforme correspondiente a este sombreador.

SetIntUniform(String, Int32, Int32, Int32)

Establece el valor uniforme correspondiente a este sombreador.

SetIntUniform(String, Int32, Int32, Int32, Int32)

Establece el valor uniforme correspondiente a este sombreador.

SetIntUniform(String, Int32[])

Establece el valor uniforme correspondiente a este sombreador.

SetLocalMatrix(Matrix)

Establezca la matriz local del sombreador.

(Heredado de Shader)
ToArray<T>()

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

(Heredado de Object)
ToString()

Devuelve una representación de cadena del objeto.

(Heredado de Object)
UnregisterFromRuntime()

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

(Heredado de Object)
Wait()

Hace que el subproceso actual espere hasta que se despierte, normalmente por ser em notificado/em> o <em>interrumpido</em>.<><

(Heredado de Object)
Wait(Int64)

Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <notificado<>/em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real.

(Heredado de Object)
Wait(Int64, Int32)

Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <notificado<>/em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real.

(Heredado de Object)

Implementaciones de interfaz explícitas

IJavaPeerable.Disposed()

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

(Heredado de Object)
IJavaPeerable.DisposeUnlessReferenced()

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

(Heredado de Object)
IJavaPeerable.Finalized()

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

(Heredado de Object)
IJavaPeerable.JniManagedPeerState

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

(Heredado de Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

(Heredado de Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

(Heredado de Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

(Heredado de Object)

Métodos de extensión

JavaCast<TResult>(IJavaObject)

Realiza una conversión de tipos comprobados en tiempo de ejecución de Android.

JavaCast<TResult>(IJavaObject)

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

GetJniTypeName(IJavaPeerable)

RuntimeShader Calcula un color por píxel basado en la salida de una función definida por el usuario android Graphics Shading Language (AGSL).

Se aplica a