Carlos Castillo, 04-36817 Juan García, 05-38207 Estructura general de un programa: Inicializar el estado de OpenGL Configurar y abrir una ventana Procesar eventos de usuario Dibujar una imagen Primitivas de OpenGL GLUT – The OpenGL Utility Toolkit “The Graphics Pipeline” Graphics State Application Vertices (3D) Vertex Vertex Processor Processor Assembly & Rasterization Fragments (pre(pre-pixels) transformed, Lit Vertices (2D) CPU GPU Pixel Pixel Processor Processor Final pixels (Color, Depth) Video Memory (Textures) RenderRender-toto-texture También conocido como Glslang, es un lenguaje de programación (similar a C/C++). Creado por OpenGL ARB (Architecture Review Board) para crear programas (llamados shaders) que serán ejecutados en la GPU. GLSL permitió utilizar shaders más complejos y de tamaño variable. Usar shaders mejora el despeño de cálculos de iluminación y transformación de geometría. Podemos transferir carga de trabajo, como el movimiento de algunos gráficos, del CPU al GPU. Se ejecutan sobre cada uno de los vértices de entrada al generado durante el proceso procesador gráfico. de rasterización. Proporcionan un control general Permite manipular fragmentos. sobre todos los vértices. Es un archivo que contiene el Es un archivo fuente que código fuente y ejecutará en el contiene el código de entrada procesador de fragmentos. para el procesador gráfico. Trabaja sobre cada fragmento Es compilado y enlazado. Vertex Shader Es compilado, se genera un ejecutable. Fragment Shader Vertex Shader Fragments Shader Es una herramienta capaz de trabajar con la estructura de vértices de figuras modeladas en 3D, y realizar operaciones matemáticas sobre ella para definir colores, texturas e incidencia de la luz. Los datos de los vértices (posición, color, coordenadas de textura) son cargados en el GPU. Cada vértice genera una ejecución en el shader. El shader arroja una posición que va a ser interpolada por el rasterizador. Color Normal Position Texture coord etc… Texture data Vertex Shader Modelview matrix Material Lighting etc… Custom variables Per-vertex attributes Color Position Custom variables Por vértice: ◦ Transformación de los vértices ◦ Transformación de las normales ◦ Generación de las coordenadas de las texturas ◦ Transformación de las coordenadas de texturizado ◦ Iluminación ◦ Aplicación de color al material. Es un programa ejecutado luego de la rasterización que permite hacer diversas transformaciones como cambiar la profundidad o trabajar con texels así como calcular efectos de iluminación con gran precisión. También es útil para modificar la profundidad. Los datos de los vértices (posición, color, coordenadas de textura) son interpolados para luego formar los fragmentos . Trabaja sobre cada fragmento generado (aplicación de texturas, niebla, convoluciones, etc). Cuando un conjunto de fragment shaders es compilado, se genera un fragment shader ejecutable que trabaja sobre el procesador de fragmentos. Color Texture coords Fragment coords Front facing Texture data Material Lighting etc… Custom variables Fragment Shader Fragment color Fragment depth Por fragmento: ◦ Las operaciones en valores interpolados ◦ Textura de acceso ◦ Textura aplicación ◦ Niebla ◦ Color suma ◦ Opcionalmente: - Pixel zoom - Escala y sesgo - Color tabla de búsqueda - Circunvolución Traslación Escalamiento Rotación Double Buffering Depth Buffering Iluminación Mapeo de texturas Height Fields Cartoon shading Uso de OpenGL y GLSL Tipos basicos: float, int, bool. Sampler: tipo int para manejo de texturas vec2, vec3, vec4: Vectores de flotantes de dos, tres y cuatro entradas respectivamente ivec2, ivec3, ivec4: Vectores de enteros de dos, tres y cuatro entradas respectivamente bvec2, bvec3, bvec4: Vectores de bool de dos, tres y cuatro entradas respectivamente mat2, mat3, mat4: Matrices de flotantes de 2x2, 3x3 y 4x4 respectivamente Librerías necesarias: Freeglut3: Alternativa open source para GLUT Freeglut3-dev Libglut3: Provee una interface para la creación de ventanas con contenido en OpenGL y con manejo de interacción con el usuario Libglut3-dev Libhugs-glut Glew (OpenGL Extension Wrangler): librería de C/C++ que permite cargar extensiones de OpenGL y saber cuales de estas extensiones son soportadas en la plataforma actual Para compilar un programa usando las librerías de Glew para un programa de OpenGl, se usa: gcc –lGL –lglut –lGLEW example.c –o example Y luego correr con: ./example glCreateProgramObjectARB - Crea un programa al que luego tendremos que asociar los shaders. glCreateShader ObjectARB- Crea un shader (vertex o fragment) al que luego tendremos que pasar el código. glShaderSourceObjectARB - Pasa al shader el código. glCompileShaderObjectARB - Compila el código que le hemos pasado al shader. glAttachShaderObjectARB - Asocia un shader a un programa. glLinkProgramARB - Hace link del programa después de asociarle un vertex y un fragment shader. glUseProgramObjectARB- Indica a OpenGL que use un programa para hacer render (pintar). Obtener el código fuente del shader a partir de un archivo. Crear los objetos shaders y el objeto programa. Cargar los objetos shaders con el código leído del archivo fuente. Compilar los Objetos Shaders Adjuntar los shaders al objeto programa. Ligar el objeto programa con nuestra aplicación. Indicar a nuestra aplicación que utilice nuestro objeto programa en lugar de las funciones de OpenGL. Definir los objetos de los shaders y el programa: Obtener el código fuente del programa: Crear los objetos Shaders y el programa: Agregar el codigo fuente a los shaders Compilar los Shaders Enlazar los shaders al programa Hacer link de nuestro programa a la aplicación y correr Si se desea, se puede eliminar los shaders