pag 1-opengl reloaded
Post on 12-Feb-2018
232 Views
Preview:
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
top related