Tutorial 6

Instrumentos de Control y mezcla alpha

En este tutorial se empiezan a complicar las cosas... Cambiaremos los valores alpha de los objetos usando un instrumento de control. Esto significa que tendremos un instrumento que no producirá un resultado visible sino que generará una variable global a la que todos los demás instrumentos tendrán acceso. Cuando se quieren modificar simultaneamente varios instrumentos es necesario usar una variable global que puede ser controlada por un 'instrumento de control'. Los instrumentos de control deben tener siempre un número menor que los instrumentos que serán controlados. Esto es debido al orden en que csound procesa los instrumentos.

Cuando se usan valores alpha, un nuevo concepto llamado 'mezcla alpha' o 'alpha' blending' se debe explicar. El alpha blending es el proceso de mezclar colores según los valores alpha de la fuente (SRC) y del destino (DST). El objeto fuente es el creado más tarde en la cadena gráfica, ya sea porque pertence a un grupo con valor GLinsert mayor o porque está creado más tarde. El color final de cada pixel se define como:

C = Csrc * F src + Cdst * Fdst

Donde C es el color original y F se refiere a la función de mezcla (blending function) usada. Por ejemplo cuando:

glBlendFunc $GL_SRC_ALPHA,$GL_ONE_MINUS_SRC_ALPHA

La función usada será:

C = Csrc * α src + Cdst * (1- αsrc)

En este caso el color del objeto de adelante (SRC) se multiplicar por su propio valor alpha, y el color del objeto de destino se multiplica por (1 menos el alpha del objeto fuente). Así que veremos más del objeto trasero cuando el alpha del objeto fuente es menor. Puede pensarse el alpha como el valor de transparencia, siendo 1 totalmente opaco y 0 totalmente transparente.

Entender esto puede ser algo complicado así que lo mejor es experimentar bastante, con este y otros programas.

<CsoundSynthesizer>
<CsOptions>
-+Y
</CsOptions>
<CsInstruments>

#include "OpenGL.h"

sr=100
kr =100
ksmps=1
nchnls=1

GLfps 30
GLpanel "OpenGL panel", 512, 512
GLpanel_end
FLrun




glMatrixMode $GL_PROJECTION
glLoadIdentity
gluPerspective 60,0.1,100
glMatrixMode $GL_MODELVIEW
;Agregaremos dos líneas a nuestros encabezados. Esto habilita el mezclado alpha y define como se hace éste.
;Primero usamos la instrucción glEnable, que sirve para habilitar funciones openGL. Puede tener muchos valores
;diferentes, pero por ahora sólo usamos $GL_BLEND para habilitar la mezcla alpha.
glEnable $GL_BLEND
;La función de mezcla se define por medio de glBlendFunc, que tiene dos parametros. El primero define
;como se modifica el alpha de la fuente y el segundo indica como se modifica el alpha del destino.
;El valor $GL_SRC_ALPHA,$GL_ONE_MINUS_SRC_ALPHA es el valor má común porque da los
;resultados esperados, sin embargo otros valores dan resultados muy interesantes.
glBlendFunc $GL_SRC_ALPHA,$GL_ONE_MINUS_SRC_ALPHA

GLinsert_i $GL_NOT_VALID

glClear $GL_COLOR_BUFFER_BIT + $GL_DEPTH_BUFFER_BIT
GLinsert_i 1.1

gisine ftgen 1,0,1024,10,1

;Aquí definimos nuestro instrumento de control. Note el comentario que acompaña al instrumento. En Csound
;Cualquier cosa después de un punto y coma es ignorado.
instr 1 ;control instrument
gkalpha linseg 0,10,1,10,1,10,0
;Aquí definimos una variable global de tipo k. Una variable que comienza por g es una variable global. Una variable
;de tipo k es la que se actualiza en cada ciclo de control. Hay kr ciclos de control en un segundo (vea el encabezado
;donde kr=100). Usualmente las señales de control no necesitan ser actualizadas con tanta frecuencia como las
;señales de audio, por eso Csound, usa variable de control, que reducen la carga del proceso. La instrucción linseg
;define a la variable gkalpha como una función hecha de segmentos de líneas. Si revisa el manual, éste le dirá que
;el primer parametro es el valor inicial, y luego van por pares indicando la duración y el valor siguiente. En este caso tenemos
;3 segmentos, iniciando en 0, luego subiendo por 10 segundos hasta 1, donde se queda 10 segundos y luego una bajada
;a 0 nuevamente durante 10 segundos. Esta función inicia en el momento en que se activa el instrumento en el
;score, en este caso en el tiempo 0. Esto es todo lo que hará este instrumento.
endin

instr 2
;Ahora el instrumento 2 que dibujará en la pantalla.
ired = p4
igreen = p5
iblue = p6
iy = p7
;Como hemos hecho antes, asignamos los campos-p a variables de tipo i para darles un nombre.
glLoadIdentity
talpha = t (gkalpha)
;Como las instrucciones gráficas sólo trabajan con variables de tipo t y de tipo i (cualquier otra variable produce
;un error), usamos esta función para convertir la varible global de tipo k en una varible local de tipo t.
tmove GLoscil 2,360,1
;Usamos la variabel tmove para guardar el resultado de un oscilador, esta vez fijo, con amplitud de 2, haciendo
;un ciclo cada 360 cuadros, y oscilando según la tabla 1, que de nuevo es una onda sinusoidal.
glTranslate tmove,iy,-6
;Ahora hacemoes un desplazamiento, moviendo tmove unidades en el eje x, y desplazando un valor fijo iy en y,
;además de seis unidades hacia adentro en el eje z.
glColor ired,igreen,iblue,talpha
;El color del objeto lo determina la activación del instrumento en el score, y el valor alpha se modifica según el
;instrumento de control global definido arriba. He usado un instrumento de control para que el valor alpha de todos
;los objetos sea igual independientemente de en qué momento se activa un objeto.
glBegin $GL_QUADS
glVertex3 0,0,0
glVertex3 1,0,0
glVertex3 1,1,0
glVertex3 0,1,0
glEnd
GLinsert 1.5
;Dibujamos un cuadrado como siempre.
endin



</CsInstruments>
<CsScore>

i 1 0 30
;Primero llamamos a nuestro instrumento de control, y lo hacemos durar todo lo que queremos que esté activo,
;En este caso 30 segundos.

i 2 2 28 1 0 0 1
i 2 3 27 0 1 0 0.8
i 2 4 26 0 0 1 0.6
i 2 5 25 1 0 1 0.4
i 2 6 24 0 1 1 0.2
i 2 7 23 1 1 0 0
i 2 8 22 1 1 1 -0.2
i 2 9 21 1 1 0 -0.4
i 2 10 20 0 1 1 -0.6
i 2 11 19 1 0 1 -0.8
i 2 12 18 0 0 1 -1
i 2 13 17 0 1 0 -1.2
i 2 14 16 1 0 0 -1.4
;Aquí llamamos 13 veces al instrumento 2, cada uno con diferente color y posición y. Note que es sólo el hecho
;de que comienzan en diferente tiempo lo que hace que se cree el movimiento ondulatorio.

</CsScore>
</CsoundSynthesizer>

Este fue el tutorial 6. Recuerde como siempre experimentar con valores, y cambiando cosas. Es la única manera de aprender.
Note como el instrumento de control 'conecta' a los dem'as objetos, permitiéndoles compartir un valor así comiencen en tiempos diferentes o tengan diferente duración.
Note también como el cambio en el valor alpha puede pensarse como un cambio de transparencia. El comportamiento de los valores alpha depende completamente de la función de mezcla usada. Resutados muy interesantes se pueden lograr con diferentes funciones alpha. Los valores que pueden ocupar cualquiera de las dos casillas en glBlendFunc son:

$GL_SRC_ALPHA

$GL_ONE_MINUS_SRC_ALPHA

$GL_DST_ALPHA

$GL_ONE_MINUS_DST_ALPHA

$GL_ONE

$GL_ZERO


Regreso al menú de tutoriales de Video