pag 1-opengl reloaded

Upload: josekukuku

Post on 12-Feb-2018

232 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/23/2019 PAG 1-OpenGL Reloaded

    1/39

    Programacin de Aplicaciones Grficas1 OpenGL reloaded

  • 7/23/2019 PAG 1-OpenGL Reloaded

    2/39

    ESQUEMADELACLASE

    Tipos de shaders

    Por qu? Shader programs

    1 2 3

  • 7/23/2019 PAG 1-OpenGL Reloaded

    3/39

    Legacy /Compatibility

    Core profile

  • 7/23/2019 PAG 1-OpenGL Reloaded

    4/39

    Por qu?

  • 7/23/2019 PAG 1-OpenGL Reloaded

    5/39

    Legacy / CompatibilityDeprecated

    In the process of authoring computer software, its standards ordocumentation, deprecation is a status applied to software features to

    indicate that they should be avoided, typically because they have beensuperseded. Although deprecated features remain in the software, theiruse may raise warning messages recommending alternative practices,and deprecation may indicate that the feature will be removed in the

    future. Features are deprecatedrather than immediately removedinorder to provide backward compatibility, and give programmers who

    have used the feature time to bring their code into compliance with thenew standard.

  • 7/23/2019 PAG 1-OpenGL Reloaded

    6/39

    CP ms eficiente

    CP ms flexible

    Legacy / CompatibilityDeprecated

  • 7/23/2019 PAG 1-OpenGL Reloaded

    7/39

    glBegin(GL_QUADS);

    glEnd();

    glVertex3f(x1,y1,z1);

    glVertex3f(x2,y2,z2);

    glVertex3f(x3,y3,z3);

    glVertex3f(x4,y4,z4);

    glNormal3f(n1,n1,n1);

    glNormal3f(n2,n2,n2);

    glNormal3f(n3,n3,n3);

    glNormal3f(n4,n4,n4);GPU

    OpenGL Legacy/compatibility

  • 7/23/2019 PAG 1-OpenGL Reloaded

    8/39

    glBindVertexArray

    glDrawArray

    GPU

    OpenGL Core Profile

  • 7/23/2019 PAG 1-OpenGL Reloaded

    9/39

    OpenGL Legacy/compatibility

    Viewport

    Divisin perspectiva

    Clipping

    Transformacin

    Procesamiento de lageometra (por vrtice)

    Test blending

    Test depth

    Test scissor

    Test alpha

    Rasterizador

    Procesamientopor fragmento

    Aplicar texturas

    Test stencil

    Datos de vrtices

    Datos de texturas

  • 7/23/2019 PAG 1-OpenGL Reloaded

    10/39

    OpenGL Core Profile

    Viewport

    Divisin perspectiva

    Clipping

    Procesamiento de lageometra (por vrtice)

    Test blending

    Test depth

    Test scissor

    Test alpha

    Rasterizador

    Procesamiento

    por fragmento

    Test stencil

    Datos de vrtices

    Datos de texturas

    Geometry shader

    Vertex shader

    Datos de texturas

    Fragment shader

    Compute shader

  • 7/23/2019 PAG 1-OpenGL Reloaded

    11/39

    Vertex shader

    Aplicar transformaciones

    3D objeto clipping space

  • 7/23/2019 PAG 1-OpenGL Reloaded

    12/39

    Vertex shader

    Aplicar transformaciones

    3D objeto clipping space

    Aplicar desplazamiento (textura)

  • 7/23/2019 PAG 1-OpenGL Reloaded

    13/39

    Vertex shader

    Aplicar transformaciones

    3D objeto clipping space

    Aplicar desplazamiento (textura)

    Calcular color del vrtice

  • 7/23/2019 PAG 1-OpenGL Reloaded

    14/39

    Fragment shader

    Aplicar color a cada pixel

    IMPORTANTE: Se ejecuta una sola vez por pixel paracada primitiva. Millones de veces en total.

    OPTIMIZACIN

  • 7/23/2019 PAG 1-OpenGL Reloaded

    15/39

    Geometry shader

    Crea nuevas primitivas a partir de

    la salida del vertex shader

    Evaluar funciones complejas como superficies de Bzir

    o triangular polgonos complejos

  • 7/23/2019 PAG 1-OpenGL Reloaded

    16/39

    Compute shader

    Ejemplos: sistemas de partculas o simulacin de ropa

    Permite al programador acceder a una arquitecturaparalela y vectorial de propsito general

    No lo vamos a ver este curso

  • 7/23/2019 PAG 1-OpenGL Reloaded

    17/39

    GLSL

  • 7/23/2019 PAG 1-OpenGL Reloaded

    18/39

    GLS

    L

    Open

    hading

    anguage

  • 7/23/2019 PAG 1-OpenGL Reloaded

    19/39

    Ejemplo de vertex shader

    #version 400

    layout(location = 0) invec3vPosition;

    uniformmat4mvpMatrix;

    uniformvec3vColor;uniformfloatpointSize;

    outvec4destinationColor;

    voidmain() {

    gl_PointSize= pointSize;destinationColor = vec4(vColor, 1.0);gl_Position= mvpMatrix * vPosition;

    }

  • 7/23/2019 PAG 1-OpenGL Reloaded

    20/39

    Ejemplo de fragment shader

    #version 400

    invec4destinationColor;

    outvec4fColor;

    voidmain() {vec2coord = gl_PointCoord- vec2(0.5);if(length(coord) > 0.5)

    discard;

    fColor = destinationColor;}

  • 7/23/2019 PAG 1-OpenGL Reloaded

    21/39

    Descartando fragmentos

    vec2coord = gl_PointCoord- vec2(0.5);

    if(length(coord) > 0.5)discard;

    (0.0,0.0)

    (1.0,1.0)

    vec2(0.5)

    gl_PointCoord

    gl_PointCoord

  • 7/23/2019 PAG 1-OpenGL Reloaded

    22/39

    Variables

    in Variables que se pasan a este shaderdesde otras etapas de pipeline derendering

    out Variables que se pasan desde esteshader hacia otras etapas de pipelinede rendering

    uniform Parmetros de entrada que se pasandesde el programa al shader

  • 7/23/2019 PAG 1-OpenGL Reloaded

    23/39

    Variables

    in

    out

    uniform Vertex shader

  • 7/23/2019 PAG 1-OpenGL Reloaded

    24/39

    Built-in variables

    gl_PointSize Tamao en pixels del puntoque se va a rastrear. Slo sise las primitivas son puntos

    gl_Position Posicin en el espacio declipping del vrtice actual

    gl_PointCoord Posicin del fragmento actualdentro del punto actual. En elintervalo [0,1]. Slo si lasprimitivas son puntos

  • 7/23/2019 PAG 1-OpenGL Reloaded

    25/39

    Shader programs

    Shader source

    Shader source

    Shader object

    Shader program

    Shader object

    Cargar

    Cargar

    Compilar

    Compilar

    Enlazar (link)

    Asignar (attach)

    Asignar

    (attach)

  • 7/23/2019 PAG 1-OpenGL Reloaded

    26/39

    1 - Crear el shader program

    // - Creando el shader program

    GLuint program = glCreateProgram();

    if (program==0) {qDebug()

  • 7/23/2019 PAG 1-OpenGL Reloaded

    27/39

    2 - Abrir y leer el shader source

    // - Abriendo el shader source

    std::string shaderString;QFile shaderSource(name);if (!shaderSource.open(QIODevice::ReadOnly))

    { qDebug()

  • 7/23/2019 PAG 1-OpenGL Reloaded

    28/39

    3 - Crear el shader object

    // - Crear el shader object

    GLuint shaderHandler = glCreateShader(type);if (shaderHandler == 0) {

    qDebug()

  • 7/23/2019 PAG 1-OpenGL Reloaded

    29/39

    4 - Compilar el shader object

    // - Asignar el shader source al shader object

    const char *c_str = shaderString.c_str();glShaderSource(shaderHandler, 1, &c_str, NULL);

    // - Compilar el shader object

    glCompileShader(shaderHandler);GLint compileResult;

    glGetShaderiv(shaderHandler,GL_COMPILE_STATUS,&compileResult);if (compileResult == GL_FALSE) {

    qDebug()

  • 7/23/2019 PAG 1-OpenGL Reloaded

    30/39

    5 - Asignar y enlazar el shader program

    // - Asignar el shader object al shader program glAttachShader(program, shaderHandler);

    // - Enlazar el shader program glLinkProgram(program);GLint linkSuccess = 0;

    glGetProgramiv(program, GL_LINK_STATUS, &linkSuccess);if (linkSuccess == GL_FALSE) {

    qDebug()

  • 7/23/2019 PAG 1-OpenGL Reloaded

    31/39

    6 - Usar el shader program

    // - Usar el shader program

    glUseProgram(shaderProgram);

    // - Pasarle los uniforms

    std::string name = mvpMatrix;GLint location = glGetUniformLocation(program, name.c_str());if (location >= 0) {

    glUniformMatrix4fv(location, 1, GL_FALSE, value.data());

    } else {qDebug()

  • 7/23/2019 PAG 1-OpenGL Reloaded

    32/39

    Vertex array object VAO

    Objeto OpenGL que almacena todo el estado necesario

    para pasar informacin sobre vrtices a la GPU

    Dentro tiene uno o ms Vertex buffer objects

  • 7/23/2019 PAG 1-OpenGL Reloaded

    33/39

    Vertex buffer object VBO

    Trozo contiguo de memoria gestionada por OpenGL

    Es parte de la memoria de la tarjeta de vdeo

    Contiene datos sobre los vrtices

    posicin, normal, coordenadas de textura, etc.

  • 7/23/2019 PAG 1-OpenGL Reloaded

    34/39

    VAO vs VBO

  • 7/23/2019 PAG 1-OpenGL Reloaded

    35/39

    VAO vs VBO

  • 7/23/2019 PAG 1-OpenGL Reloaded

    36/39

    Rellenar los vertex array y buffer object GLfloat vertices[] = {-1.0, -1.0, 0.0,

    1.0, -1.0, 0.0,1.0, 1.0, 0.0,-1.0, 1.0, 0.0};

    GLuint indices[] = {0,1,2,3};

    GLuint vao;glGenVertexArrays(1, &vao);glBindVertexArray(vao);

    GLuint vbo;glGenBuffers(1, &vbo);glBindBuffer(GL_ARRAY_BUFFER, vbo);

    glEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), 0);

    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glGenBuffers(1, &ibo);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);

    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices,GL_STATIC_DRAW);

  • 7/23/2019 PAG 1-OpenGL Reloaded

    37/39

    Usos del buffer de vrtices

    STREAM Los datos se modifican una vez y como mucho se usanunas pocas veces

    Los datos se modifican una vez y se usan muchas veces

    Los datos se modifican repetidamente y se usan muchas

    veces

    Los datos se modifican por la app y se usan por OpenGLpara dibujar primitivas

    Los datos modifican por OpenGL y se usan para devolverdatos calculados en la GPU a la app

    Los datos se modifican repetidamente y se usan muchasveces

    STATIC

    DYNAMIC

    DRAW

    READ

    COPY

  • 7/23/2019 PAG 1-OpenGL Reloaded

    38/39

    Dibujar las primitivas

    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glEnable(GL_PROGRAM_POINT_SIZE);

    glEnable(GL_DEPTH_TEST);glEnable(GL_MULTISAMPLE);

    glBindVertexArray(vao);

    glUseProgram(shaderProgram);// - Aqu rellenar los uniforms

    glDrawElements(GL_POINTS, 4, GL_UNSIGNED_INT, NULL);

  • 7/23/2019 PAG 1-OpenGL Reloaded

    39/39

    Prxima clase