Intro 64k II

Shader

El gran Iñigo Quílez creando su Framework para intros, se preocupo de que los shader sean fáciles de incorporar.Ahora añadire uno facil.
Antes de nada el codigo lo estube mirando de la pagina de iñigo Quilez y http://www.pouet.net, mas concretamente de http://www.pouet.net/prod.php?which=53554 donde esta el codigo de una presentacion completa. Muchas gracias a Collapse y Gatitos por el codigo. Y ya que estamos esta pagina esta bien para tomar un primer contacto con los shaders http://www.ubicuos.com/2010/04/08/primer-acercamiento-a-shaders-con-glsl/ .

Ahora bien, para crear Shader necesitamos 2 programitas uno de fragment shader y otro pixel shaders. Para ayudar haciendo Shader vienen bien esta pagina de developers. y sobretodo el programa FX Composer 2.5.

Variables globales; Son muy utiles en intros pork nos ahorramos el pasarlos como parametros. Necesitamos:
GLUquadricObj *qobj = 0; //El objeto que modificaremos con los Shaders y lo renderizaremos.

uint32 terrainShader=0; //Hace referencia al programa que tendra los Shaders.

Para compilar los shaders y poderlos ejecutar facilmente;
uint32 CompileShader (const char *vs, const char *fs)
{
GLuint program, shader;
program = oglCreateProgram();
// Vertex shader
shader = oglCreateShader(GL_VERTEX_SHADER);
oglShaderSource (shader, 1, &vs, NULL);
oglCompileShader (shader);
oglAttachShader (program, shader);
// Fragment shader
shader = oglCreateShader(GL_FRAGMENT_SHADER);
oglShaderSource (shader, 1, &fs, NULL);
oglCompileShader (shader);
oglAttachShader (program,shader);
oglLinkProgram (program);
return program;
}

Al iniciar la intro hay que llamar al compilador de shader por cada tipo de shader que queramos incorporar, inicializar el objeto que usaremos para que sea renderizado e inicializar texturas.

qobj = gluNewQuadric ();
gluQuadricTexture (qobj, GL_TRUE);

terrainShader = CompileShader (TerrainVP, TerrainFP);

Los TerrainVP y TerrainFP son punteros a char que contiene el programa.

Dentro del bucle toca poner la camara y renderizar el objeto. Para la cámara ponemos :

glMatrixMode( GL_PROJECTION );
glLoadMatrixf( projectionmatrix );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
gluLookAt(0.0f,4.0f, 0.0f,
5.0f,3.50f, 5.0f,
0.0f,1.0f, 0.0f);

Para renderizar el famoso objeto:

oglUseProgram(
terrainShader
);
oglUniform3f(oglGetUniformLocation(
terrainShader
, "var"), 0.f, 5.f, 0.f);//Variable que recibe el el shader.

glRotatef (-90.f, 1.f, 0.f, 0.f);
gluDisk(qobj, 0.f,50.0f, 32, 32);

El oglUniform3f, es para pasarle parametros al shader. En este caso le pasamos tres floats, no esta implementado en el framework y hay que añadirlo facilmente en msys_glext.h. Habra que añadir lo sigueinte:
  1. Modificar el #define NUMFUNCIONES (3+5+1+0+4+12+1+11) añadiendo un +1 pork añadimos una funcion mas.
  2. Despues casi abajo del todo un #define oglUniform3f ((PFNGLUNIFORM3FPROC)msys_oglfunc[37]).
  3. En el msys_glext.cpp modificar el static char *funciones para añadir el nuevo "glUniform1f\x0"
Pues con esto, ya deberia valer, ahora a probar cosas. Suerte

Para facilitar el asunto a la gente k esta empezado igual que yo, Aqui esta el codigo de algo muy sencillito.

Comentarios

Entradas populares de este blog

SVN , Repositiorios para grandes proyectos.

Intro 64k I