Paul Dahuach

DESCARGAS
  Visual Basic
vbGL: Simple triangulo con OpenGL en VB6

Captura de vbGL Ejemplo 1 (Triangle)

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

Captura de vbGL Ejemplo 2 (Arrays)

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

Captura de vbGL Ejemplo 3 (Texture Coord Array)

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

Captura de vbGL Ejemplo 4 (MultiPass)

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

Captura de vbGL Ejemplo 5 (MultiTexture)

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

Captura de vbGL Ejemplo 6 (Dot3 BumpMap)

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

Captura de vbGL Ejemplo 7 (NormalMap y GlossMap)

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

Captura de vbGL Ejemplo 8 (Cg Shadow Volume)

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

Captura de vbGL Ejemplo 9 (Sphere Collision Detection)

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

Captura de vbGL Ejemplo 10 (Ray Collision Detection)

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 o vbNet

Captura de vbCg Ejemplo 1

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.

Para aquellos que desean una introducción a Cg desde Visual Basic .Net, podrán encontrar un ejemplo en vb.Net equivalente utilizando el Tao Framework entre las referencias.

Referencias:
Cg Toolkit
vbGL 1.2 (ANSI) Type Library
Cg Wrapper For Visual Basic
Cg Vertex Program con vbNet 2005 y Tao

Paul Dahuach, 2008-03-02.

vbCg: Vertex and Fragment Program con OpenGL en VB6

Captura de vbCg Ejemplo 2 (Vertex and Fragment Program)

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

Captura de vbCg Ejemplo 3 (Uniform Parameter)

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

Captura de vbCg Ejemplo 4 (Varying Parameter)

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

Captura de vbCg Ejemplo 5 (Texture Sampling)

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

Captura de vbCg Ejemplo 6 (Vertex Twisting)

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

Captura de vbCg Ejemplo 7 (Two Textures Accesses)

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

Captura de vbCg Ejemplo 8 (Vertex Transform)

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

Captura de vbCg Ejemplo 9 (Vertex Lighting)

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

Captura de vbCg Ejemplo 10 (Fragment Lighting)

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

Captura de vbCg Ejemplo 11 (Two Lights with Structs)

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

Captura de vbCg Ejemplo 12 (Light Attenuation)

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

Captura de vbCg Ejemplo 13 (SpotLight)

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

Captura de vbCg Ejemplo 14 (Bulge)

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

Captura de vbCg Ejemplo 15 (Particle System)

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

Captura de vbCg Ejemplo 16 (Keyframe Interpolation)

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

Captura de vbCg Ejemplo 18 (Cube-Map Reflection)

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

Captura de vbCg Ejemplo 19 (Cube-Map Refraction)

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

Captura de vbCg Ejemplo 20 (Cube-Map Chromatic Dispersion)

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

Captura de vbCg Ejemplo 21 (Bump-Map Wall)

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

Captura de vbCg Ejemplo 24 (Keyframe Interpolation)

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

Captura de vbCg Ejemplo 25 (Uniform Fog)

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

Captura de vbCg Ejemplo 26 (CgFX ProcFx)

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

Captura de vbCg Ejemplo 27 (CgFX Combine Program)

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

Captura de vbCg Ejemplo 28 (CgFX Bump Demo)

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

Captura de vbCg Ejemplo 29 (CgFX Bump Demo2)

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

Captura de vbCg Ejemplo 30 (CgFX Interface)

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

Captura de vbCg Ejemplo 31 (Buffer Lighting)

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

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

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

NeHe Lesson 27 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

NeHe Lesson 37 en VB6

NeHe Lesson 38 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

NeHe Lesson 39 en VB6

NeHe Lesson 40 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)

NeHe Lesson 41 en VB6

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

NeHe Lesson 42 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

NeHe Lesson 43 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

NeHe Lesson 44 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

NeHe Lesson 45 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

NeHe Lesson 46 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

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

NeHe Lesson 48 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

vbNewton Hola Mundo 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

vbNewton 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

Valid HTML 4.01 Transitional