OpenGL Shading Language - Escuela Superior de Informática

Anuncio
Tema 5
Lenguajes de programación
David Vallejo Fernández
Curso 2007/2008
Escuela Superior de Informática
Índice de contenidos
1.Introducción.
2.OpenGL Shading Language.
3.NVIDIA Cg Programming Language.
4.DirectX High-Level Shader Language.
5.Resumen.
2
1
Introducción
3
Introducción
●
Conceptos básicos.
–
Shader.
●
●
Conjunto de instrucciones destinadas a aplicar
efectos de renderizado.
Utilizados para programar la GPU.
–
–
–
●
Fixed pipeline --> programmable pipeline.
Mayor flexibilidad.
Mayor eficiencia.
Parte del proceso de render responsable de
calcular el color de un objeto.
4
Introducción
●
Conceptos básicos.
–
Shader.
Flexibilidad!
Eficiencia!
5
Introducción
●
Conceptos básicos.
–
Shader. Clasificación.
●
Vertex shaders.
–
–
–
–
Ejecutados por la GPU para cada vértice.
Transformar la posición 3D en 2D.
Manipulan posiciones, colores, coordenadas de
texturas.
Salida hacia un geometry shader o a la etapa de
rasterización.
6
Introducción
●
Conceptos básicos.
–
Shader. Clasificación.
●
Vertex shaders.
// Transformación de la posición de un punto simulando
// la aceleración de la gravedad.
uniform float t;
// Tiempo obtenido desde la aplicación.
attribute vec4 vel; // Velocidad de la partícula.
Const vec4 g = vec4(0.0, -9.80, 0.0);
void main ()
{
vec4 posicion = gl_Vertex;
posicion += t * vel + t *t * g;
gl_Position = gl_ModelViewProjectionMatrix * posicion;
}
7
Introducción
●
Conceptos básicos.
–
Shader. Clasificación.
●
Geometry shaders.
–
–
–
Pueden añadir y eliminar vértices de una malla.
Usados para generar geometrías o añadir
volumen.
Salida hacia la etapa de rasterización.
8
Introducción
●
Conceptos básicos.
–
Shader. Clasificación.
●
Geometry shaders.
!!NVgp4.0
# División de un triángulo
en 4 triángulos iguales.
PRIMITIVE_IN TRIANGLES;
PRIMITIVE_OUT TRIANGLE_STRIP;
VERTICES_OUT 8;
ATTRIB v0 = vertex[0].position;
ATTRIB v1 = vertex[1].position;
ATTRIB v2 = vertex[2].position;
TEMP m0, m1, m2;
# Cálculo de puntos.
ADD m0, v0, v1;
MUL m0, m0, 0.5;
ADD m1, v1, v2;
MUL m1, m1, 0.5;
ADD m2, v2, v0;
MUL m2, m2, 0.5;
# output 3 triangles as triangle strip
MOV result.position, v0; EMIT;
MOV result.position, m2; EMIT;
MOV result.position, m0; EMIT;
MOV result.position, m1; EMIT;
MOV result.position, v1; EMIT;
ENDPRIM;
# output 4th triangle
MOV result.position, v2; EMIT;
MOV result.position, m1; EMIT;
MOV result.position, m2; EMIT;
ENDPRIM;
END
9
Introducción
●
Conceptos básicos.
–
Shader. Clasificación.
●
Pixel shaders.
–
–
–
–
a.k.a. fragment shaders.
Calculan el color de píxeles individuales.
Utilizados para iluminación y efectos como el
bump mapping.
DirectX usa el término pixel shader y OpenGL el
de fragment shader.
10
Introducción
●
Conceptos básicos.
–
Shader. Clasificación.
●
Pixel shaders.
// Mapeado de texturas simple.
varying vec2 texture_coordinate;
void main()
{
// Transformación del vértice.
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
// Paso de la coordenada de la textura al fragment shader.
texture_coordinate = vec2(gl_MultiTexCoord0);
}
varying vec2 texture_coordinate;
uniform sampler2D my_color_texture;
void main()
{
// Muestreo de la textura y envío al frame buffer.
gl_FragColor = texture2D(my_color_texture, texture_coordinate);
}
11
Introducción
●
Conceptos básicos.
–
Shader. Clasificación.
●
Unified shader model.
–
–
–
–
Unificación de los tres tipos de shader.
En OpenGL y en DirectX 10.
Flexibilidad al asignar más shaders a la tarea con
más carga de trabajo.
Ejemplos de tarjetas gráficas.
● Serie 8 de NVIDIA GeForce.
● Serie 2000 de ATI Radeon HD.
● Serie X3000 de Intel GMA.
12
Introducción
●
Conceptos básicos.
–
Shading language.
●
Lenguaje de programación para shaders.
●
Tipos de datos especiales (color, normal...).
●
Clasificación.
–
–
Renderizado en producción.
● RenderMan Shading Language.
Renderizado en tiempo real.
● OpenGL shading language.
● Cg programming language.
● DirectX High-Level Shader Language.
13
2
OpenGL Shading Language
14
OpenGL Shading Language
●
¿Cómo opera OpenGL?
–
2 máquinas: vertex y fragment.
15
OpenGL Shading Language
●
Con OpenGL 2.0...
–
Programmable shading pipeline.
●
●
Procesamiento de vértices y fragments con
GLSL.
¿Qué estudiaremos?
–
Cómo afectan los shaders al procesamiento de
vértices y fragments.
–
Qué se requiere para la integración de shaders
en un programa OpenGL.
–
Cómo escribir shaders.
16
OpenGL Shading Language
●
Procesamiento de vértices.
–
Transformación de vértices.
–
Transformación y normalización de normales.
–
Generación de coordenadas de textura.
–
Transformación de coordenadas de textura.
–
Iluminación.
–
Etc.
17
OpenGL Shading Language
●
Procesamiento de fragments.
–
Operaciones en valores interpolados.
–
Acceso a texturas.
–
Aplicación de texturas.
–
Niebla.
–
Suma de colores.
–
Etc.
18
OpenGL Shading Language
●
Interfaz con GLSL.
–
–
Parecido a programar en C.
●
Compilación.
●
Debugging.
●
Generación de código objeto.
●
Enlazado.
Diferencias...
●
El compilador y el enlazador son parte del driver
OpenGL.
19
OpenGL Shading Language
●
Interfaz con GLSL.
–
–
Para cada objeto shader...
●
Crear un objeto (vertex o fragment).
●
Compilar el código del shader en dicho objeto.
●
Verificar que la compilación fue correcta.
Para enlazar varios objetos en un programa...
●
Crear un programa shader.
●
Asociar los objetos al programa.
●
Enlazar el programa.
●
Verificar que el enlazado fue correcto.
●
Utilizar el shader.
20
OpenGL Shading Language
●
Interfaz con GLSL.
–
¿Por qué crear múltiples objetos shader en un
programa?
–
Funciones importantes.
Gluint glCreateShader (GLenum type);
void glShaderSource (Gluint shader, Glsizei count,
const Glchar **string, const Glint *length);
void glCompileShader (Gluint shader);
Gluint glCreateProgram ();
void glAttachShader (Gluint program, Gluint shader);
void glLinkProgram (Gluint program);
void glUseProgram (Gluint program);
21
OpenGL Shading Language
●
Interfaz con GLSL.
–
1) Crear los shaders y el programa.
glhandleARB v, f, p;
v = glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB);
f = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB);
p = glCreateProgramARB();
–
2) Leer el código de los shaders.
char *vs = read (vertex_shader_path);
char *fs = read (fragment_shader_path);
glShaderSourceARB (v, 1, &vs, NULL);
glShaderSourceARB (f, 1, &fs, NULL);
–
3) Compilar, asociar y enlazar los shaders.
glCompileShaderARB (v);
glCompileShaderARB (f);
glAttachObjectARB (p, v);
glAttachObjectARB (p, f);
glLinkProgramARB (p);
22
OpenGL Shading Language
●
Creación de shaders con GLSL.
–
~ programa en C.
void main ()
{
// Código del shader.
/* Más código...*/
// No se devuelve un int.
// Instrucciones terminan con ;
}
–
Fuertemente tipado (float f = 10).
–
Tipos agregados.
●
vec2, ivec3, bvec4, mat2...
●
Ej.: vec3 velocity = vec3 (0.0, 2.0, 3.0);
●
Estructuras, arrays...
23
OpenGL Shading Language
●
Creación de shaders con GLSL.
–
Modificadores de tipos.
●
–
–
const, attribute, uniform, varying.
Sentencias.
●
Operaciones aritméticas (++, --, (), [], ...).
●
Operadores de sobrecarga (vec_a * vec_b).
●
Funciones. Paso de parámetros.
...
24
3
NVIDIA Cg Programming Language
25
NVIDIA Cg
●
Basado en el lenguaje C.
●
Vertex y frament programs.
●
Modelo de programación.
26
NVIDIA Cg
●
Distintos perfiles.
–
Perfiles avanzados.
●
–
Perfiles básicos.
●
●
OpenGL NV2X, DirectX 8.
Declaraciones.
–
●
OpenGL ARB, NV40, NV30, DirectX 9.
Similares a C (y a GLSL).
E/S.
–
Varying inputs.
–
Uniform inputs.
27
NVIDIA Cg
●
●
Tipos y operaciones de datos.
–
Básicos.
–
Estructuras.
–
Arrays.
–
Conversiones de tipo.
Interfaces (como en C# y C++).
interface Light {
float3 illuminate (float3 P, out float3 L);
float3 color (void);
}
●
Sentencias y operaciones (~ C).
28
NVIDIA Cg
●
Cg Runtime.
–
#include <Cg/cg.h>
–
#include <Cg/cgGL.h>
–
#include <Cg/cgD3D9.h>
// Crear un contexto.
CGcontext ctx = cgCreateContext ();
// Compilar un programa.
Cgprogram p = cgCreateProgram (ctx, CG_SOURCE, vertexProgramString,
CG_PROFILE_ARBVP1, “main”, args);
// Cargar un programa en OpenGL.
cgGLLoadProgram(program);
// Modificar un parámetro en OpenGL.
CgGLSetParameter4fv (param, value);
// Ejecutar un programa en OpenGL.
CgGLBindProgram (p);
29
NVIDIA Cg
●
Puesta en marcha.
–
Requisitos.
●
Nvidia-cg-toolkit (no es free software).
–
–
http://developer.nvidia.com/object/cg_toolkit.html#downloads
Debian y derivados.
●
Paquetes nvidia-cg-toolkit y xorg-dev.
–
●
apt-get install nvidia-cg-toolkit xorg-dev
Documentación en /usr/share/doc.
30
NVIDIA Cg
●
Ejemplo simple.
// This is C2E1v_green from "The Cg Tutorial" (Addison-Wesley, ISBN
// 0321194969) by Randima Fernando and Mark J. Kilgard. See page 38.
struct C2E1v_Output {
float4 position : POSITION;
float3 color : COLOR;
};
C2E1v_Output C2E1v_green(float2 position : POSITION)
{
C2E1v_Output OUT;
OUT.position = float4(position,0,1);
OUT.color = float3(0,1,0);
}
return OUT;
31
NVIDIA Cg
●
Ejemplo simple.
int main(int argc, char **argv) {
glutInit (/*parameters*/);
glut*Func(callbackFunc);
myCgContext = cgCreateContext();
cgSetParameterSettingMode(myCgContext,
CG_DEFERRED_PARAMETER_SETTING);
myCgVertexProfile = cgGLGetLatestProfile(CG_GL_VERTEX);
cgGLSetOptimalOptions(myCgVertexProfile);
myCgVertexProgram =
cgCreateProgramFromFile(
myCgContext,
/* Cg runtime context */
CG_SOURCE,
/* Program in human-readable form */
myVertexProgramFileName, /* Name of file containing program */
myCgVertexProfile,
/* Profile: OpenGL ARB vertex program */
myVertexProgramName,
/* Entry function name */
NULL);
/* No extra compiler options */
checkForCgError("creating vertex program from file");
cgGLLoadProgram(myCgVertexProgram);
glutMainLoop();
return 0;
}
32
NVIDIA Cg
●
Ejemplo simple.
static void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
cgGLBindProgram(myCgVertexProgram);
checkForCgError("binding vertex program");
cgGLEnableProfile(myCgVertexProfile);
checkForCgError("enabling vertex profile");
/* Rendering code verbatim from Chapter 1, Section 2.4.1
"Rendering a Triangle with OpenGL" (page 57). */
glBegin(GL_TRIANGLES);
glVertex2f(-0.8, 0.8);
glVertex2f(0.8, 0.8);
glVertex2f(0.0, -0.8);
glEnd();
cgGLDisableProfile(myCgVertexProfile);
checkForCgError("disabling vertex profile");
glutSwapBuffers();
}
33
NVIDIA Cg
●
Ejemplo simple.
static void keyboard(unsigned char c, int x, int y)
{
switch (c) {
case 27: /* Esc key */
/* Demonstrate proper deallocation of Cg runtime data structures.
Not strictly necessary if we are simply going to exit. */
cgDestroyProgram(myCgVertexProgram);
cgDestroyContext(myCgContext);
exit(0);
break;
}
}
●
Más ejemplos en nvidia-cg-toolkit/examples.
34
4
DirectX High­Level Shader Language
35
DirectX HLSL
●
Lenguage de shaders propietario.
●
Desarrollado por Microsoft.
●
Uso con Direct3D.
●
Vertex, geometry y pixel shaders.
36
DirectX HLSL
●
Ejemplo simple. Vertex shader.
float4x4 view_proj_matrix;
float4x4 texture_matrix0;
struct VS_OUTPUT
{
float4 Pos : POSITION;
float3 Pshade : TEXCOORD0;
};
VS_OUTPUT main (float4 vPosition : POSITION)
{
VS_OUTPUT Out = (VS_OUTPUT) 0;
// Transform position to clip space
Out.Pos = mul (view_proj_matrix, vPosition);
// Transform Pshade
Out.Pshade = mul (texture_matrix0, vPosition);
return Out;
}
Clip space
3D texture
37
DirectX HLSL
●
Ejemplo simple. Pixel shader.
float4 lightWood; // xyz == Light Wood Color
float4 darkWood; // xyz == Dark Wood Color
float ringFreq; // ring frequency
Calculado por el vertex
sampler PulseTrainSampler;
shader para cada vértice
float4 hlsl_rings (float4 Pshade : TEXCOORD0) : COLOR
{
float scaledDistFromZAxis = sqrt(dot(Pshade.xy, Pshade.xy)) *
ringFreq;
float blendFactor = tex1D (PulseTrainSampler, scaledDistFromZAxis);
return lerp (darkWood, lightWood, blendFactor);
Acceso a la textura
}
38
5
Resumen
39
Resumen
●
●
●
Conceptos básicos (shader, shading
language, clasificación...).
Ventajas y desventajas de los lenguajes de
alto nivel para programación de
aplicaciones gráficas.
Conocer la interfaz básica de GLSL y los
pasos para la creación de shaders.
40
Resumen
●
Referencias.
–
OpenGL Shading Language.
●
OpenGL Programming Guide (Fifth Edition).
–
●
OpenGL Shading Language.
–
●
–
Chapter 2.
http://www.lighthouse3d.com/opengl/glsl/
NVIDIA Cg.
●
–
Chapter 15.
http://developer.nvidia.com/page/cg_main.html
HLSL.
●
ati.amd.com/developer/ShaderX2_IntroductionToHLSL.pdf
41
Descargar