|
|
Visual Basic
|
vbGL: Simple triangulo con OpenGL en VB6
Un ejemplo minimalista para aquellos que quieran determinar que es
lo que se precisa para comenzar a trabajar con OpenGL.
Referencias:
vbGL 1.2 (ANSI) Type Library
vb6 OpenGL Triangle
Paul Dahuach, 2008-05-18.
|
|
vbGL: Introducción a los Arrays con OpenGL en VB6
Una vez que hayas utilizado hasta el cansancio los triángulos de
OpenGL, caerás en cuenta que, cuanto mayor sea la cantidad de
triángulos, mayor será la cantidad de llamadas a la API y mayor
el tiempo de latencia entre cuadro y cuadro. Para evitar esta
latencia, openGL ha presentado varios recursos a lo largo de
su evolución, el que presentamos aquí, es uno de los primeros
y no requiere de aceleración por hardware. En el ejemplo,
cargamos una serie de vértices, normales y colores, extraidos
del primer nivel del demo de Quake 3 de Id Software y
almacenados en archivos independientes, para facilitar
la carga desde vb. La magia reside en enviar la mayor
cantidad posible de vertices en una sola llamada a OpenGL, para
esto utilizamos el siguiente código:
glEnableClientState GL_VERTEX_ARRAY
glEnableClientState GL_NORMAL_ARRAY
glEnableClientState GL_COLOR_ARRAY
glVertexPointer 3, GL_FLOAT, 0, Vertices(0).xyz(0)
glNormalPointer GL_FLOAT, 0, Normals(0).xyz(0)
glColorPointer 3, GL_FLOAT, 16, Colors(0).xyzw(0)
glDrawArrays GL_TRIANGLES, 0, vertexCount
glDisableClientState GL_VERTEX_ARRAY
glDisableClientState GL_NORMAL_ARRAY
glDisableClientState GL_COLOR_ARRAY
Existen otras matrices como GL_TEXTURE_COORD_ARRAY y GL_INDEX_ARRAY,
estas merecen un ejemplo aparte.
Referencias:
vbGL 1.2 (ANSI) Type Library
vb6 OpenGL Arrays
Paul Dahuach, 2008-05-18.
|
|
vbGL: Texture Coord Arrays con OpenGL en VB6
Este ejemplo introduce el uso de la matriz GL_TEXTURE_COORD_ARRAY,
una muestra sencilla del procedimiento ordinario. Se cargan
las coordenadas en una matriz, se habilita el uso de texturas
con glEnable GL_TEXTURE_2D, se avisa al motor que debe tomar
en cuenta el puntero a matrices de coordenadas de texturas con
glEnableClientState GL_TEXTURE_COORD_ARRAY,
se indica al motor donde puede tomar los datos con
glTexCoordPointer pasándole el primer elemento de nuestra matriz y
glDrawArrays se encarga de utilizar las coordenadas a la hora de
dibujar. Para terminar se deshabilita el uso de texturas para
dejar el estado como se lo encontró originalmente; para ello
utilizamos glDisableClientState GL_TEXTURE_COORD_ARRAY y
glDisable GL_TEXTURE_2D.
Referencias:
vbGL 1.2 (ANSI) Type Library
vb6 OpenGL Texture Coord Array
Paul Dahuach, 2008-05-24.
|
|
vbGL: Multiples texturas (GL_BLEND) con OpenGL en VB6
Un poco más sobre la aplicación de texturas. Uno de los métodos
primitivos para aplicar varias texturas sobre un mismo objeto es
dibujar repetidamente el objeto cambiando de textura en cada
iteración. Dicho de otra forma, se selecciona una textura y
se dibuja, se selecciona otra textura y se vuelve a dibujar.
Este proceso de aplicar varias texturas una sobre otra es posible
gracias GL_BLEND que indica al motor que debe realizar una operación
lógica entre el dibujo nuevo y el que ya tiene listo para
presentar en pantalla, por ejemplo glBlendFunc GL_ZERO, GL_SRC_COLOR
indica al motor que combine el color del objeto a dibujar con
el color almacenado en el frame buffer. Este método tiene la
ventaja de ser compatible con las placas de video mas antiguas
y la desventaja de tener que dibujar varias veces lo mismo.
En este ejemplo se utiliza para dibujar una textura base y
sobre ella un lightmap, o sea una textura que simula las luces
y sombras que se proyectarían sobre los objetos si se ubicara
la iluminación adecuada.
Referencias:
vbGL 1.2 (ANSI) Type Library
vb6 OpenGL Multiple Passes
Paul Dahuach, 2008-05-24.
|
|
vbGL: Multiples texturas (MultiTexture) con OpenGL en VB6
Para este ejemplo, precisamos una placa de video que pueda manejar
mas de una textura a la vez. Si la placa nos lo permite, podemos
combinar mas de una textura en una sola pasada. Esto nos permite
reducir considerablemente la cantidad de datos que tenemos que
enviar al motor, puesto que los vertices, normales, colores, etc.
se dibujarán una sola vez, siendo el hardware el encargado de
combinar todas las texturas correctamente. Para utilizar esta
técnica, nos servimos de las extensiones de OpenGL. Con
glActiveTexture y glClientActiveTexture podemos indicar al motor
a qué unidad de texturas nos referimos con los comandos que le
indiquemos a continuación. En este ejemplo solo utilizamos las
dos primeras unidades (GL_TEXTURE0_ARB y GL_TEXTURE1_ARB).
Referencias:
vbGL 1.2 (ANSI) Type Library
vb6 OpenGL MultiTexture
Paul Dahuach, 2008-05-24.
|
|
vbGL: Multiples texturas (dot3 bumpmap) con OpenGL en VB6
En este ejemplo vemos nuevamente la gran utilidad de poder
manejar mas de una textura a la vez. Con las dos primeras unidades
de textura se manejan una textura base y una textura con el
mapa de normales necesaria para generar el bumpmap. El bumpmap
es la técnica que simula un gran nivel de detalle en un objeto
que en realidad tiene muy pocos vertices. Para lograr el efecto
se pueden utilizar técnicas muy variadas, en este caso, utilizamos
la segunda textura combinada con la matriz de colores que en
lugar de contener los colores, contiene el vector de la luz
en espacio tangencial.
Referencias:
vbGL 1.2 (ANSI) Type Library
vb6 OpenGL Dot3 BumpMap
Paul Dahuach, 2008-05-24.
|
|
vbGL: Cg Normal Map y Gloss Map con OpenGL en VB6
En este ejemplo, aplicamos los ejemplos de Cg en nuestro pequeño cubo, agregando además
un GlossMap que utilizamos para generar brillo adicional en la superficie del bump map.
Nota: si se aplica una textura completamente blanca como gloss map, se obtendrá un
material super brilloso.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
OpenGL Extensions 2.0 para VB6
vb6 OpenGL Normal Map + Gloss Map
Paul Dahuach, 2008-06-01.
|
|
vbGL: Cg Shadow Volume con OpenGL en VB6
Un ejemplo sencillo de una técnica para la generación de sombras que se ayuda de un
shader para extrudar la silueta del cuerpo que proyecta las sombras. El ejemplo proviene
de Andreas T Jonsson en http://www.codesampler.com que a su vez se inspiró en
de este artículo de GameDev.
Utiliza, además, las extensiones de OpenGL para acceder a glActiveStencilFaceEXT.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
OpenGL Extensions 2.0 para VB6
vb6 Cg Shadow Volumes
Paul Dahuach, 2008-06-01.
|
|
vbGL: Detección de Colisiones con esferas con ColDet.dll, OpenGL y VB6
Un ejemplo introductorio a la detección de colisiones, en esta oportunidad
utilizamos la librería ColDet.dll de www.photoneffect.com,
en forma indirecta a través de nuestra vbColDet.dll que de manera similar a vbCg20.dll, simplemente
llama a las funciones en la dll original; en este caso, en realidad, debe ir un poco mas alla, pues
ColDet trabaja con clases C, por ello es que a través de vbColDet, se crean
instancias de esas clases. Por el momento no necesitamos crear una gran cantidad de instancias,
pues solo estamos testeando las colisiones con la habitación que nos rodea, por esto vbColDet solo permite
crear hasta dos instancias de modelo a la vez.
En la imágen, se observa un triángulo resaltado con verde que corresponde al último triángulo con el que
colisionamos, y una esfera en color rojo que corresponde al punto exacto de la colisión.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
OpenGL Extensions 2.0 para VB6
ColDet - Free 3D Collision Detection Library
vb6 Sphere Collision Detection
Paul Dahuach, 2008-06-03.
|
|
vbGL: Detección de Colisiones de rayos con ColDet.dll, OpenGL y VB6
Explorando un poco más en las posibilidades de la librería
ColDet.dll, encontramos la posibilidad de detectar colisiones
entre un rayo y un triángulo cualquiera. El rayo es emitido
desde un punto, con determinada dirección y con un alcance
regulable. El ejemplo utiliza un shader Cg para realizar
bump mapping, aunque este carece de una transformación
adecuada al espacio tangencial. También utiliza un shader
presentado aquí hace un tiempo que intenta recrear una
superficie cubierta de cabello. Para capturar / liberar
el direccionamiento de la vista con el mouse, basta con
presionar el botón derecho.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
OpenGL Extensions 2.0 para VB6
ColDet - Free 3D Collision Detection Library
vb6 Ray Collision Detection
Paul Dahuach, 2008-06-15.
|
|
vbCg: Vertex Program (Shaders) con OpenGL en VB6
Una de las funcionalidades mas codiciadas de OpenGL
es el acceso a la programacion de las aceleradoras 3D. Es la herramienta
fundamental de los juegos de ultima generacion. Estos transfieren
piezas de programacion directamente a la memoria de la aceleradora
para que esta los ejecute al momento de dibujar cada pixel o cada vertice.
Existen varios lenguajes de alto nivel que permiten crear los programas
en un lenguaje similar, en algun punto, al C. Por ejemplo, al utilizar GLSL
se envia el codigo fuente a OpenGL a traves de la funcion glShaderSourceARB,
se solicita que el motor lo convierta en el lenguaje que la aceleradora puede
entender, es decir lo compila, a traves de la funcion glCompileShaderARB y finalmente
se lo activa o selecciona mediante la funcion glUseProgramObjectARB.
Otro metodo disponible para acceder a la programacion de la aceleradora es el
Cg Toolkit de NVIDIA,
(Cg = "C" for graphics), que presenta un modelo, en algun punto, similar: a traves de la funcion
cgCreateProgramFromFile se le envia el codigo fuente a la dll, cgGLLoadProgram lo compila
y una llamada a cgGLBindProgram se encarga de activarlo en el momento adecuado.
Ahora bien, como era de esperarse, ninguna de estas librerias esta pensada para ser accedida desde
un lenguaje como Visual Basic, asi pues nos encontramos una vez mas lejos de los ultimos adelantos
en cuanto a generacion de graficos en 3D. El mundo de los graficos en 3D forma parte del reino de
los lenguajes de mas bajo nivel como el C/C++. Pues bien, sucede que escribiendo una pequeña libreria
a modo de intermediaria, tenemos acceso a toda la potencia grafica que brindan estas herramientas. En este
caso, la libreria elegida fue el Cg Toolkit de NVIDIA.
La libreria que expongo en este articulo simplemente exporta una serie de funciones utilizando el metodo
de llamadas conocido como _stdcall, quedando asi, listas para ser utilizadas por VB
a traves de instrucciones Declare. El unico trabajo que realizan las funciones es
llamar a su vez, a la funcion correspondiente en la libreria de NVIDIA. Para evitar confusiones, las funciones
exportadas por nuestra dll intermediaria contienen el prefijo "vb6_" antepuesto al nombre original de la funcion.
Por ejemplo, vb6_cgCreateContext es la encargada de llamar a la funcion cgCreateContext en cg.dll y vb6_cgGLLoadProgram
es la encargada de llamar a cgGLLoadProgram en cgGL.dll.
Mas abajo se puede encontrar un enlace a un ejemplo basico de la utilizacion de esta libreria que llamaremos, con una
total falta de imaginacion: vbCg. Junto con el ejemplo se puede hallar la libreria compilada bajo el nombre vbCg.dll.
La libreria fue desarrollada y testeada con la version 1.5.0.23 del Cg Toolkit, desconozco que grado de compatibilidad
tendra con nuevas versiones del toolkit. El ejemplo utiliza la libreria de tipos vbGL.tlb que puede ser descargada de
http://home.pacific.net.hk/~edx/tlb.htm, la cual ahorra la declaracion
de las funciones basicas para utilizar OpenGL desde VB6.
Los invito a descargar Vertex Program con vbCg, probarla y postear cualquier sugerencia en el Foro de Programacion.
En la medida de lo posible, contestare a las sugerencias y corregire los errores que seguramente se habran deslizado.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
Cg Wrapper For Visual Basic
Paul Dahuach, 2008-03-02.
|
|
vbCg: Vertex and Fragment Program con OpenGL en VB6
El primer ejemplo ilustra el uso basico de la libreria cargando un
Vertex Program desde un archivo. El paso siguiente es sin duda
el cargar un Fragment Program.
El procedimiento es muy similar al anterior:
cgGLGetLatestProfile recupera la ultima configuracion referida a los Fragment Programs,
cgGLSetOptimalOptions hace que estos datos se conviertan en la configuracion actual,
cgCreateProgramFromFile se encarga de cargar en memoria el codigo fuente del shader,
cgGLLoadProgram compila el codigo fuente.
Mas adelante, una vez dentro del Loop principal de renderizado, se llama
a cgGLBindProgram y cgGLEnableProfile hacen que se incluya en la pila de tareas
del procesador.
Para evitar efectos indeseados, se desactiva el perfil con cgGLDisableProfile.
No olvidar la limpieza de memoria al final del programa, en lo que respecta al
Fragment Program, esta se realiza con cgDestroyProgram.
Nota: estos ejemplos pueden parecer excesivamente sencillos o carentes
de utilidad, pero como en todas las areas del conocimiento, es siempre
conveniente, comenzar por lo mas sencillo e ir ganando complejidad
a medida que se consolidan las ideas. En las proximas semanas ire
agregando ejemplos cada vez mas avanzados, incluyendo: pasaje de parametros,
multitexturas, transformacion de vertices, iluminacion dinamica, bump mapping,
vertex buffers, etc, etc. Hasta pronto.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Vertex and Fragment Program
Paul Dahuach, 2008-03-22.
|
|
vbCg: Uniform Parameter con OpenGL en VB6
Un paso mas en la serie de OpenGL, esta vez pasando un parámetro al Vertex Program desde nuestra aplicación.
En Cg este tipo de parametros se llaman Uniform Parameters y permiten manejar variables globales dentro del
shader desde el exterior de la placa 3D, en este caso, desde nuestro programa.
Las funciones relevantes en este ejemplo son las siguientes:
cgGetNamedParameter obtiene un identificador o handle que podemos utilizar hacer referencia a un parametro,
cgSetParameter3f permite enviar el valor al parametro. Existen distintas variantes del comando, que permiten enviar mas o menos datos, dependiendo de las necesidades del programa.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Uniform Parameter
Paul Dahuach, 2008-03-25.
|
|
vbCg: Varying Parameter con OpenGL en VB6
Los parámetros variables son aquellos que se manejan dentro del shader mismo, asi pues, el ejemplo se limita solamente
a demostrar que el programa del shader es el que se encarga de jugar con los colores entre un pixel y otro.
Nota: Los ejemplos que vengo presentando en esta serie, estan basados en los que proporciona NVIDIA junto con la instalación
del Cg Toolkit. La verdadera novedad en ellos es que están implementados en Visual Basic 6 utilizando vbCg.dll,
mientras que los de NVIDIA utilizan C y acceden directamente a sus propias librerias asi como a la librería auxiliar GLUT.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Varying Parameter
Paul Dahuach, 2008-03-26.
|
|
vbCg: Texture Sampling con OpenGL en VB6
En este ejemplo se toman las coordenadas de textura en el vertex shader, se pasan al
pixel/fragment shader y éste, adicionalmente, obtiene el color a aplicar al pixel, de acuerdo a la textura
que le indicamos a través de un uniform parameter llamado "decal" a lo largo del código del shader.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Texture Sampling
Paul Dahuach, 2008-04-15.
|
|
vbCg: Deformación de Vértices con OpenGL en VB6
En este ejemplo el vertex shader se encarga de realizar transformaciones
sobre los vértices que recibe como entrada aplicándoles un cierto grado de rotación
de acuerdo a un parámetro que alimentamos desde el programa en vb. El shader
recibe los vértices de lo que debiera ser un simple triángulo
y entrega una forma suavemente deformada del mismo.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Vertex Twisting
Paul Dahuach, 2008-04-15.
|
|
vbCg: Acceso a múltiples Texturas con OpenGL en VB6
En este ejemplo los shaders se encargan de desplazar las coordenadas
de una única textura y realizar una interpolación lineal entre los
colores correspondientes a las coordenadas desplazadas.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Two Textures Accesses
Paul Dahuach, 2008-04-19.
|
|
vbCg: Transformación de Vértices con OpenGL en VB6
En este ejemplo el vertex shader establece la posición de los
objetos transformando de object space a clip space. Para ello,
se construyen todas las matrices necesarias en vb y se envía
el resultado de las operaciones al shader.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Vertex Transform
Paul Dahuach, 2008-04-19.
|
|
vbCg: Iluminación por Vértice con OpenGL en VB6
En este ejemplo, el vertex shader aplica las transformaciones
indicadas desde vb sobre la posición de los vértices y
realiza el cálculo de las propiedades de los materiales
relacionadas con la iluminación tales como emissive, ambient, diffuse y specular, entregando
al fragment shader el color a aplicar ya procesado. El fragment
shader simplemente pasa el valor recibido para que sea dibujado.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Vertex Lighting
Paul Dahuach, 2008-04-19.
|
|
vbCg: Iluminación por Pixel con OpenGL en VB6
Este ejemplo es una evolución del ejemplo anterior, dejando en este caso,
que los cálculos lumínicos se computen en el pixel shader, aumentando
el nivel de precisión obtenido.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Fragment Lighting
Paul Dahuach, 2008-04-19.
|
|
vbCg: Dos luces y Structs con OpenGL en VB6
Como lo indica el título, se configuran dos luces y se introduce
el uso de Structs en Cg (algo asi como Types en vb6). Los cálculos
son realizados en el vertex shader, mientras que el pixel shader
simplemente pasa los argumentos recibidos a la siguiente etapa
para ser dibujados.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Two Lights with Structs
Paul Dahuach, 2008-04-19.
|
|
vbCg: Atenuación de luces con OpenGL en VB6
Extendiendo los ejemplos anteriores, esta vez se propone
un efecto de luz que pierde potencia a medida que avanza en la
distancia. Los cálculos para aplicar
la iluminación se realizan en el fragment shader, tomando los
argumentos enviados desde el vertex shader.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Light Attenuation
Paul Dahuach, 2008-04-19.
|
|
vbCg: Luces con dirección (SpotLights) con OpenGL en VB6
En este ejemplo, se agrega una dirección a la luz, para simular
el efecto de una luz de spot, es decir, una luz que afecta
una zona reducida y específica.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg SpotLight
Paul Dahuach, 2008-04-19.
|
|
vbCg: Iluminación de Formas Deformadas (Bulge) con OpenGL en VB6
En este caso, se utilizan los argumentos del vertex shader para
realizar desplazamientos en los vértices recibidos y adicionalmente,
iluminar de forma correcta las formas deformadas resultantes.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Bulge
Paul Dahuach, 2008-04-19.
|
|
vbCg: Sistema de Partículas con OpenGL en VB6
En este caso, se genera un sistema de partículas con ayuda del
vertex shader, éste se encarga de calcular la posición, el
color y el tamaño de las partículas en base a los valores
enviados desde vb.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Particle System
Paul Dahuach, 2008-04-19.
|
|
vbCg: Interpolación de Cuadros Clave con OpenGL en VB6
Este ejemplo presenta un uso para la función lerp (Lineal Interpolation).
Adicionalmente, presenta una manera sencilla de cargar un archivo
en formato md2, desarrollado por Id Software para el archiconocido
Quake 2.
También muestra como cargar los vértices, normales y coordenadas
de textura en Vertex Buffers para evitar el transito recurrente
entre cpu y gpu.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Keyframe Interpolation
Paul Dahuach, 2008-04-22.
|
|
vbCg18 vbCg: Cube-Maps y Reflejo del Ambiente con OpenGL en VB6
Este ejemplo, junto con los siguientes hasta el 21, son traducciones de aquellos que
se adjuntan al Cg Toolkit de NVIDIA versión 2.0, aunque no utilizan las funciones
que se agregan en esa versión, sino que utilizan únicamente las que estaban incluidas
en la versión 1.5.
En este caso en particular, carga una textura con sus correspondientes mipmaps, para
aplicar a la figura central y el grupo de seis imágenes que conforman el cubo que
conforma el ambiente. Ambos grupos de texturas son extraidos de sendos archivos dds
(DirectDraw Surfaces) accediendo directamente al archivo en forma binaria.
El efecto central del ejemplo se halla en la generación de reflejos del medio
ambiente sobre la superficie de la figura central, para lograrlo se sirve de la
siguiente linea de programa: texCUBE(environmentMap, R), donde R es una coordenada de
textura proveniente del vertex shader generada con la siguiente instrucción: R = reflect(I, N);.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Cube-Map Reflection
Paul Dahuach, 2008-04-24.
|
|
vbCg: Cube-Maps y Refracción del Ambiente con OpenGL en VB6
Una variación del ejemplo anterior, en el que se simula el rebote
de la luz en el interior de un cuerpo refractante. La instrucción clave en el
ejemplo, se halla una vez mas, en el vertex shader: T = refract(I, N, etaRatio);
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Cube-Map Refraction
Paul Dahuach, 2008-04-24.
|
|
vbCg: Cube-Maps y Dispersión Cromática del Ambiente con OpenGL en VB6
Otra variación del ejemplo 18, en el que se combinan los conceptos
de reflexión y refracción.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Cube-Map Chromatic Dispersion
Paul Dahuach, 2008-04-24.
|
|
vbCg: Introducción a los Bump-Maps con OpenGL en VB6
Este ejemplo sirve de introducción a la técnica de bump-mapping aplicándola
sobre un objeto plano de lo mas sencillo, como es un cuadrado.
Sirve también, para demostrar cuán sencillo resulta implementar
este efecto cuando se cuenta con acceso a la aceleración por
hardware y a un recurso tan útil como texCUBE().
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Bump-Map Wall
Paul Dahuach, 2008-04-24.
|
|
vbCg: BumpMaps con OpenGL en VB6
La bella técnica del Bump-map, utilizando en este caso
un mapa de normales y un cube map. Se suele utilizar para
generar un altísimo nivel de detalle con un reducido grupo
de polígonos.
Al mismo tiempo, muestra como revolucionar una forma plana
para formar el torus.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Bump-Map Torus
Paul Dahuach, 2008-04-22.
|
|
vbCg: Niebla con OpenGL y Cg en VB6
Una nueva propuesta para la generación de niebla, en esta
oportunidad, utilizando una interpolación lineal en el fragment
shader con la función lerp() para calcular el grado de visibilidad
entre los objetos y la niebla.
Las texturas aplicadas a los objetos son extraidas de archivos
DDS accediendo directamente en forma binaria y pasándoselos a
OpenGL prácticamente sin proceso alguno.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Cg Uniform Fog
Paul Dahuach, 2008-04-27.
|
|
vbCg: Introducción a CgFX con Cg 2.0 y OpenGL en VB6
Es tiempo de empezar con lo bueno, CgFX desde vb6, para acceder
hubo que incorporar toda la API correspondiente a CgFX que
había sido pasada por alto en la primera versión de vbCg.dll.
Al mismo tiempo, he aprovechado para incluir las novedades de
Cg 2.0, con lo cuál, la librería pierde su compatibilidad con
Cg 1.5. Por este motivo, he rebautizado la dll como vbCg20.dll
para diferenciarla de la versión original y permitir que coexistan
ambas versiones en un mismo directorio. Cabe destacar que la nueva
dll no ha tenido aún, un período de pruebas suficientemente generoso
para asegurar un acceso normal a todas las funciones, si alguien
encuentra alguna definición incorrecta en mdlCg.bas, siéntase
libre de señalarlo y lo corregiré lo mas pronto posible.
En este ejemplo, se utiliza cgCreateEffect, cgCreateTechnique y
muchas otras funciones que no estaban disponibles hasta ahora
con vbCg.dll.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 CgFX ProcFx
Paul Dahuach, 2008-04-28.
|
|
vbCg: CgFX Combinación de Programas con Cg 2.0 y OpenGL en VB6
Un derivado del ejemplo del torus, utilizando la funcion cgCombinePrograms
para cargar desde distintos archivos y combinarlos en memoria, pudiendo luego
acceder a ellos como si se tratara de uno solamente.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 CgFX Combine Program
Paul Dahuach, 2008-05-01.
|
|
vbCg: CgFX Bump Demo con Cg 2.0 y OpenGL en VB6
Un derivado del ejemplo del torus utilizando un archivo .cgfx
para definir la interfaz que estará accesible desde la api de
cg. Define además, distintas implementaciones del algoritmo
principal para que se pueda elegir según el hardware disponible.
El código en vb está preparado para dibujar en múltiples pasadas,
aunque el cgfx solo define una.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 CgFX Bump demo
Paul Dahuach, 2008-05-01.
|
|
vbCg: CgFX Bump Demo2 con Cg 2.0 y OpenGL en VB6
Un derivado del ejemplo del torus utilizando un archivo .cgfx
y definiendo distintas implementaciones del algoritmo principal
entre las que se puede elegir la deseada utilizando un menú
contextual. Las distintas implementaciones provienen de distintos
archivos físicos que se incluyen en el archivo principal en
tiempo de precompilación.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 CgFX Bump demo2
Paul Dahuach, 2008-05-01.
|
|
vbCg: CgFX Interfaces con Cg 2.0 y OpenGL en VB6
En este ejemplo se puede elegir entre distintas técnicas tomando
ventaja del modelo de shaders que implemente el hardware del cliente
y además presenta una interfaz que encapsula una lógica de capas
con efectos independientes. Incluye además, un contador de fps.
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 CgFX Interfaces
Paul Dahuach, 2008-05-01.
|
|
vbCg: Luces y Buffers con Cg 2.0 y OpenGL en VB6
Este ejemplo demuestra el uso de buffers para almacenar
materiales, transformaciones y parámetros relacionados
a la iluminación.
Para esto se sirve de funciones tales como cgCreateBuffer,
cgSetProgramBuffer, cgSetBufferSubData, cgGetParameterBufferIndex y
cgGetParameterBufferOffset,
Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
vb6 Buffer Lighting
Paul Dahuach, 2008-05-07.
|
|
vbCg: Efecto cabello con OpenGL en VB6
En esta oportunidad, un ejemplo básico de la generación en
tiempo real de cabello a través de vertex y pixels shaders.
La idea se la debo al amigo Jan Tosovsky de
nio.astronomy.cz
que me planteó la duda acerca de si podría ser posible generar
este efecto en vb. Pues aquí esta la respuesta.
Claro está que en este terreno, existen variantes mucho mas
complejas, pero creo que sirve para iniciarse en el tema. Un
buen lugar para comenzar a estudiar el tema es el artículo de
bkenwright@xbdev.net
que lo explica con una gran claridad y en forma gradual.
El ejemplo utiliza, para acceder a las extensiónes referidas
al manejo de multiples texturas, la clase de Raedwulf
Referencias:
Efecto cabello en Visual Basic 6 con vbCg
vbGL 1.2 (ANSI) Type Library
OpenGL Extensions 2.0 para VB6
Paul Dahuach, 2008-04-02.
|
|
vbCg: CgFX Glow y FBO con OpenGL en VB6
Este ejemplo proviene del sdk 10 de NVIDIA y propone un shader
para generar Gaussian Blur como efecto de post producción.
Esta versión se diferencia del original en que el último paso
dibuja el efecto terminado como una textura aplicada a un
rectángulo superpuesto a la escena original, mientras que la
versión original deja que el shader se encargue de aplicarla
automáticamente. En este ejemplo se utilizan FBO (Frame Buffer
Objects) para renderizar en dos texturas temporales. Una de
estas texturas es la que se aplica a un rectángulo ubicado
justo en frente de la cámara.
Referencias:
CgFx Glow con OpenGL en Visual Basic 6
NVIDIA SDK10 C++ Simple Glow
vbGL 1.2 (ANSI) Type Library
OpenGL Extensions 2.0 para VB6
Paul Dahuach, 2008-06-15.
|
|
NeHe Lesson 27 (Stencil Shadows Tutorial) en VB6
La generación de sombras siempre ha sido un tema difícil de
abordar, sin embargo la técnica ilustrada en este tutorial,
no lo es tanto. La implementación tiene la ventaja (o desventaja?)
de no utilizar aceleración por hardware.
Referencias:
NeHe Lesson 27
NeHe Lesson 27 en VB6
vbGL 1.2 (ANSI) Type Library
Paul Dahuach, 2008-05-31.
|
|
NeHe Lesson 37 (Cel-Shading Tutorial) & Lesson 38 (Resource File Tutorial) en VB6
Las lecciones de NeHe han sido para mi una gran ayuda
en mis comienzos con OpenGL. Si uno comienza a seguir
las lecciones desde la primera hasta la ultima,
conseguira dominar muchas de las tecnicas fundamentales
en el manejo de gráficos con OpenGL.
Gracias a las contribuciones de la comunidad,
las lecciones han sido portadas a distintos lenguajes
entre los que se encuentra Visual Basic. Lamentablemente
solamente se ha portado a VB hasta la lección 36, de un
total de 48. Una pequeña contribución de mi parte, la
lección 37 y la lección portadas a VB6.
Referencias:
NeHe Lesson 37
NeHe Lesson 38
NeHe Lesson 37 en VB6
NeHe Lesson 38 en VB6
vbGL 1.2 (ANSI) Type Library
Paul Dahuach, 2008-03-29.
|
|
NeHe Lesson 39 (Physics Tutorial) & Lesson 40 (Rope Physics Tutorial) en VB6
Dos lecciones mas portadas a vb6, en este caso referidas a la
simulación de efectos físicos como la gravedad, la aceleración,
la fricción, la masa, la fuerza, etc.
Estas lecciones no son particularmente atractivas visualmente,
pero ayudan a comprender los métodos que usualmente utilizan
los juegos ó las aplicaciones de simulación para recrear
el comportamiento de los materiales en la realidad.
En la lección 39, he intentado respetar al máximo el enfoque
del autor en la implementación y utilicé una serie de clases
para realizar todas las operaciones. Como es de esperar, esta
forma de abordar el problema en Visual Basic, no es en general,
la mas eficiente a la hora de medir tiempos de ejecución.
En la lección 40, los resultados de utilizar la misma técnica
que el autor original (todo incluido en clases) son mucho mas
notorios, asi que opté por prescindir de las clases y recurrir
a la programación de funciones, cuyo desempeño es mucho mas
eficiente en operaciones repetitivas.
Referencias:
NeHe's Lesson 39
NeHe's Lesson 40
NeHe Lesson 39 en VB6
NeHe Lesson 40 en VB6
vbGL 1.2 (ANSI) Type Library
Paul Dahuach, 2008-04-06.
|
|
NeHe Lesson 41 (Volumetric Fog Tutorial)
La Lección 41 demuestra lo sencillo que resulta agregar un efecto de niebla
volumétrica a una escena haciendo uso de la extensión GL_EXT_fog_coord.
Referencias:
NeHe's Lesson 41
NeHe Lesson 41 en VB6
vbGL 1.2 (ANSI) Type Library
Paul Dahuach, 2008-04-09.
|
|
Lesson 42 (Multiple Viewports) en VB6
La lección 42 muestra un procedimiento para manejar varios Viewports ó vistas
a la vez. Conjuntamente, nos obsequia un algoritmo para la generación de
laberintos en forma dinámica.
Referencias:
NeHe's Lesson 42
NeHe Lesson 42 en VB6
vbGL 1.2 (ANSI) Type Library
Paul Dahuach, 2008-04-09.
|
|
NeHe's Lesson 43 (TrueType Font Tutorial) en VB6
Este tutorial muestra una técnica para utilizar fuentes
TrueType con un método alternativo al utilizado clásicamente
con wglUseFontBitmaps, con el fin de lograr un efecto suavizado
al momento de dibujar texto en pantalla.
Debo confesar que me ha costado un poco lograr portar este
ejemplo a vb6, mayormente por la incompatibilidad de convenciones
de llamada presentada por la librería FreeType. La librería
cuenta con un método sencillo de cambiar la convención de
llamadas a través de las macros FT_EXPORT y FT_EXPORT_DEF,
aunque el cambiar la convención a __stdcall, que es la única
que comprende vb, produce efectos colaterales que dejan a la
dll fallando en algunos puntos del código. En definitiva, la
versión de TrueType que adjunto al código fuente del ejemplo
sólo exporta con __stdcall las funciones necesarias para portar
este ejemplo y dejo a quien quiera profundizar en este tema
la tarea de exportar con __stdcall las restantes.
Referencias:
NeHe's Lesson 43
NeHe Lesson 43 en VB6
FreeType 2.1.10 modificada para VB6
vbGL 1.2 (ANSI) Type Library
Paul Dahuach, 2008-04-13.
|
|
NeHe's Lesson 44 (Lens Flare Tutorial) en VB6
Este tutorial muestra una técnica sin aceleración por hardware
para simular el reflejo que produce la luz sobre el lente de
la cámara.
Presionando la tecla 1, se pueden ver una serie de
datos estadísticos entre los que se encuentra un contador de
FPS, así introduce junto al tema principal, procedimientos
para dibujar texto en 2D y contar los cuadros por segundo.
Referencias:
NeHe's Lesson 44
NeHe's Lesson 44 en VB6
vbGL 1.2 (ANSI) Type Library
Paul Dahuach, 2008-04-13.
|
|
NeHe's Lesson 45 (VBO (Vertex Buffer Objects) Tutorial) en VB6
Una de las lecciones más interesantes de las serie, presenta
la técnica básica para enviar una cantidad masiva de geometría,
coordenadas de texturas, colores e índices directamente a la
placa de video, aumentando considerablemente el rendimiento
al momento de dibujar escenas complejas. Las funciones relevantas
utilizadas en este ejemplo: glGenBuffersARB, glBindBufferARB,
glBufferDataARB, glVertexPointer, glTexCoordPointer y glDrawArrays.
NOTA: el ejemplo original utiliza la librería GLAUX, esta
es realmente difícil de conseguir y, puesto que nadie desea
incluir una dll de mas de 1MB por la capacidad de cargar
imágenes, he decidido prescindir de las referencias a ella.
Referencias:
NeHe's Lesson 45
NeHe's Lesson 45 en VB6
vbGL 1.2 (ANSI) Type Library
OpenGL Extensions 2.0 para VB6
Paul Dahuach, 2008-04-13.
|
|
NeHe's Lesson 46 (FSAA (Full Scene Anti Aliasing) Tutorial) en VB6
Este ejemplo, muestra como activar el efecto Anti-alias para
suavizar el clásico borde de serrucho en las superficies
diagonales. El tutorial original busca la presencia de la
extensión WGL_ARB_multisample para activar el efecto, por
mi parte, esta extensión no estaba presente en mi placa de
video, asi que agregué la búsqueda de la extensión
GL_ARB_multisample antes de dar por perdida la capacidad.
He utilizado un método alternativo al de las clases para
llamar a wglChoosePixelFormatARB, se trata de una version
modificada para la ocasión de CallApiByName, función de la
cuál desconozco su origen, pero pueden encontrarse muchas
referencias a ella en Google. Cabe destacar que este método
es mucho mas lento que el de las clases con la VTable
reemplazada, por lo cual no lo recomiendo para las partes del
código que formen parte del loop principal.
Referencias:
NeHe's Lesson 46
NeHe's Lesson 46 en VB6
vbGL 1.2 (ANSI) Type Library
OpenGL Extensions 2.0 para VB6
CallApiByName
Paul Dahuach, 2008-04-13.
|
|
NeHe's Lesson 47 en VB6
Esta es una versión portada a vb6 de la lección 47 que introduce
un ejemplo muy básico de un vertex shader que produce un efecto
visible sobre la geometría.
Para implementarlo en vb6, hechamos mano a nuestra pequeña dll
que permite acceder a la porción de OpenGL en Cg, llamada CgGL.
Nota: NVIDIA ha publicado la versión 2.0 del Cg Toolkit en Enero de 2008,
en esta presentan muchas novedades, entre las que se encuentra el acceso
a Geometry Shaders. La versión del toolkit con la que fue compilada
vbCg.dll, es la 1.5; asi, pues, no incluye las definiciones necesarias
para manejar Geometry Shaders, aunque en poco tiempo las incorporaré.
Referencias:
NeHe Lesson 47
NeHe Lesson 47 en VB6
vbGL 1.2 (ANSI) Type Library
Paul Dahuach, 2008-03-31.
|
|
NeHe's Lesson 48 (ArcBall Rotation Tutorial) en VB6
El último ejemplo hasta el día de hoy de la serie de
tutoriales de NeHe, muestra una técnica para manipular
la rotación de objetos 3D con el mouse. He visto por ahi otras
implementaciones de la misma técnica en vb, por ejemplo la de
Ken Shoemake's.
Referencias:
NeHe's Lesson 48
NeHe's Lesson 48 en VB6
vbGL 1.2 (ANSI) Type Library
Paul Dahuach, 2008-04-13.
|
|
vbNewton: Game Dynamics Hello en VB6
Un ejemplo para introducirnos en el mundo de Newton Game Dynamics, un sdk para
la simulación de efectos físicos.
Referencias:
Newton Game Dynamics
vbNewton Hello
Paul Dahuach, 2008-06-28.
|
|
vbNewton: Usando Callbacks en VB6
Un poco mas de Newton, esta vez comenzamos a utilizar las funciones de callback
que se utilizan por doquier en Newton. La función que utilizamos en este ejemplo
es llamada al momento de aplicar fuerza y torque a un cuerpo,
oportunamente, Newton pasa un puntero al cuerpo en cuestión sobre el que se va
a aplicar la fuerza. El ejemplo muestra también la forma en que Newton se encarga
de simular la colisión entre los distintos cuerpos.
Referencias:
Newton Game Dynamics
vbNewton Callbacks
Paul Dahuach, 2008-06-28.
|
|
Comentar
|
|