![Page 1: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/1.jpg)
GLSL ProgrammingNicolas Holzschuch
![Page 2: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/2.jpg)
GLSL programming
• C-like language structure: int i, j; i = 2; j = 0; j += i;
• Functions, loops, branches...
• Reading your first GSL shader is easy
![Page 3: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/3.jpg)
Differences with C
• New data types: vec, mat...
• Must write simple code
• Data input/output
• Compiling & linking
![Page 4: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/4.jpg)
New data types
• vec4: a 4-component floating-point array
• also vec2, vec3, ivec4...
• mat4: a 4x4 floating-point matrix
• also mat2, mat3...
• Standard operations on vec/mat
![Page 5: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/5.jpg)
Standard operations
• v = u + w
• does the right thing with vec/mat
• v = M*w
• Matrix-vector multiplication, matrix-matrix multiplication...
• Other operators (see reference):
• length(v), dot(v,w), cross(v,w)...
![Page 6: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/6.jpg)
Standard math functions
• sin, cos, tan...
• asin, acos, atan...
•pow, exp, log, sqrt, inversesqrt
• abs, sign, frac, floor, min, max,
• step, smoothstep
• Use them! (don’t recode them)
![Page 7: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/7.jpg)
Components & swizzle
• Access to vector components:
• u.x equivalent to u[0]
• Operations on several components:
• u.xyz = v.xyz/v.w (projection)
• Reordering:
•u = u.wzyx; w = u.xxyy;
![Page 8: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/8.jpg)
Components & swizzle
• Very useful for Image Synthesis
• Several sets of letters:
•u.xyzw / u.rgba / u.stpq
• Can use any of them
• Makes code easier to read
![Page 9: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/9.jpg)
Input & Output
• The basis for any program
![Page 10: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/10.jpg)
Input & OutputCPU
Main memory Vertex shader
Fragment shader
Frame buffer Z-buffer
![Page 11: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/11.jpg)
Input & OutputCPU
Main memory Vertex shader
Fragment shader
Frame buffer Z-buffer
![Page 12: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/12.jpg)
Input & OutputCPU
Main memory Vertex shader
Fragment shader
Frame buffer Z-buffer
CPU ➜ shaders:Uniform variables
![Page 13: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/13.jpg)
Input & OutputCPU
Main memory Vertex shader
Fragment shader
Frame buffer Z-buffer
CPU ➜ shaders:Uniform variablesShader: uniform vec3 lightSource;
![Page 14: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/14.jpg)
Input & OutputCPU
Main memory Vertex shader
Fragment shader
Frame buffer Z-buffer
CPU ➜ shaders:Uniform variablesShader: uniform vec3 lightSource;
Program: loc=glGetUniformLocation(shader, "lightSource"); glUniform3f(loc, x, y, z);
![Page 15: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/15.jpg)
Input & OutputCPU
Main memory Vertex shader
Fragment shader
Frame buffer Z-buffer
CPU ➜ shaders:Uniform variablesShader: uniform vec3 lightSource;
![Page 16: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/16.jpg)
Input & OutputCPU
Main memory Vertex shader
Fragment shader
Frame buffer Z-buffer
CPU ➜ shaders (2):Textures
![Page 17: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/17.jpg)
Input & OutputCPU
Main memory Vertex shader
Fragment shader
Frame buffer Z-buffer
CPU ➜ shaders (2):TexturesIn the shader: uniform sampler2D MyTex;
![Page 18: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/18.jpg)
Input & OutputCPU
Main memory Vertex shader
Fragment shader
Frame buffer Z-buffer
CPU ➜ shaders: discussionQ: Textures or uniform?
A: Depends on the variableConstant (for every vertex): uniformDepends on position: texture
![Page 19: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/19.jpg)
Input & OutputCPU
Main memory Vertex shader
Fragment shader
Frame buffer Z-buffer
![Page 20: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/20.jpg)
Input & OutputCPU
Main memory Vertex shader
Fragment shader
Frame buffer Z-buffer
Vertex sh. ➜ Frag. shader
![Page 21: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/21.jpg)
Input & OutputCPU
Main memory Vertex shader
Fragment shader
Frame buffer Z-buffer
Vertex sh. ➜ Frag. shaderInterpolated variables
![Page 22: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/22.jpg)
Input & OutputCPU
Main memory Vertex shader
Fragment shader
Frame buffer Z-buffer
Vertex sh. ➜ Frag. shaderInterpolated variablesVertex shader:out vec4 ambientColor;ambientColor = 0.3 * gl_Color;
Fragment shader:in vec4 ambientColor;
![Page 23: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/23.jpg)
Input & OutputCPU
Main memory Vertex shader
Fragment shader
Frame buffer Z-buffer
Fragment shader output:
![Page 24: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/24.jpg)
Input & OutputCPU
Main memory Vertex shader
Fragment shader
Frame buffer Z-buffer
Fragment shader output:
fragColor = ...; //requiredfragDepth = ...; //optional
![Page 25: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/25.jpg)
Compiling & linking
• 3 steps:
• load and compile vertex shader
• load and compile fragment shader
• link shader
• OpenGL functions:
•glShaderSource, glCreateShader, glCompileShader, glLinkProgram
![Page 26: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/26.jpg)
Compiling & linking
• 3 steps:
• load and compile vertex shader
• load and compile fragment shader
• link shader
![Page 27: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/27.jpg)
Compiling & linking
• Check the result of the compilation if (newProg != NULL) ...
• Get the errors! (glGetShaderInfoLog)
• Read them, they’re your only information
![Page 28: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/28.jpg)
One fun bug
• Compiler designed for efficiency
• Removes everything useless
• …including useless variables
• can be quite aggressive in that
• …and complains of non-existent variable
• also, C++ program tests if variable exists…
![Page 29: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/29.jpg)
That’s it!
• These are the basics
• You have a working program to start with
• Edit it, understand it, improve it
• Start with simple programs
![Page 30: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/30.jpg)
OpenGL4 and Qt5
• OpenGL 4: removes many legacy options
• more efficient, but different
• Qt5: great integration with OpenGL4
• encapsulates everything useful
![Page 31: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/31.jpg)
Loading a shader
QOpenGLShaderProgram* program = new QOpenGLShaderProgram(this);
program->addShaderFromSourceFile
(QOpenGLShader::Vertex, vertexShaderPath);
program->addShaderFromSourceFile
(QOpenGLShader::Fragment,fragmentShaderPath);
program->link();
program->bind();
![Page 32: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/32.jpg)
Loading a shader (2)QOpenGLShaderProgram* program = new QOpenGLShaderProgram(this);
if (!program) qWarning() << "Failed to allocate the shader";
bool result = program->addShaderFromSourceFile (QOpenGLShader::Vertex, vertexShaderPath);
if ( !result ) qWarning() << program->log();
result = program->addShaderFromSourceFile (QOpenGLShader::Fragment, fragmentShaderPath);
if ( !result ) qWarning() << program->log();
result = program->link();
if ( !result ) qWarning() << program->log();
program->bind();
return program;
![Page 33: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/33.jpg)
Passing variables
m_program->bind();
m_program->setUniformValue ("lightPosition",lightPosition);
![Page 34: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/34.jpg)
Encoding the scene
• Before (Open GL 3 and below): face-based glBegin(GL_POLYGON)
glVertex3f(x1,y1,z1);
glVertex3f(x2,y2,z2);
glVertex3f(x3,y3,z3);
glVertex3f(x4,y4,z4);
glEnd();
![Page 35: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/35.jpg)
Encoding the scene
• OpenGL4: Vertex Array Object
• object-based
• Single structure for each object
• Vertex, color, normals, tex coords in arrays
• VAO = set of arrays (vertex, color…)
![Page 36: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/36.jpg)
Vertex Array Objects: creation
QOpenGLVertexArrayObject m_vao;
QOpenGLBuffer m_vertexBuffer;
QOpenGLBuffer m_indexBuffer;
QOpenGLBuffer m_normalBuffer;
QOpenGLBuffer m_colorBuffer;
QOpenGLBuffer m_texcoordBuffer;
![Page 37: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/37.jpg)
Vertex array objects: filling
m_vao.bind();
m_vertexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
m_vertexBuffer.bind();
m_vertexBuffer.allocate(&(modelMesh->vertices.front()),
modelMesh->vertices.size()*sizeof(trimesh::point));
(same for index, color, normals…)
Pointer
Size (bytes)
![Page 38: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/38.jpg)
Vertex array objects: drawing
m_program->bind();
m_vao.bind();
glDrawElements(GL_TRIANGLES,
3 * modelMesh->faces.size(), GL_UNSIGNED_INT, 0);
m_vao.release();
m_program->release();
Primitive
Nb index
starting index
![Page 39: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/39.jpg)
Notes
• Only the VAO is drawn
• Internal buffers used only at creation time
• What if I only want to draw the geometry?
• driver-dependent
• = doesn’t always work
• drivers expect vertices+normals
![Page 40: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/40.jpg)
Textures
texture = new QOpenGLTexture (QImage(textureName));
texture->setWrapMode(QOpenGLTexture::Repeat);
texture->setMinificationFilter (QOpenGLTexture::LinearMipMapLinear);
texture->setMagnificationFilter (QOpenGLTexture::Linear);
texture->bind(0);
m_program->setUniformValue("colorTexture", 0);
Texture unit number
![Page 41: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/41.jpg)
Frame Buffer Objects
• For offscreen rendering
• shadow maps, deferred shading
• multi-target rendering
![Page 42: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/42.jpg)
Frame Buffer Objects
shadowMap = new QOpenGLFramebufferObject(w,h);
shadowMap->bind();
shadowMap->release();
m_program->setUniformValue("shadowMap", shadowMap->texture());
From here, all render events go to FBO
And we make it a texture for main shader
![Page 43: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/43.jpg)
Frame Buffer Objects
QOpenGLFramebufferObjectFormat sFormat;
sFormat.setAttachment(QOpenGLFramebufferObject::Depth);
sFormat.setTextureTarget(GL_TEXTURE_2D);
sFormat.setInternalTextureFormat (GL_RGBA32F_ARB);
shadowMap = new QOpenGLFramebufferObject(w, h, sFormat);
shadowMap->bind();
…
shadowMap->release();
m_program->setUniformValue("shadowMap", shadowMap->texture());
![Page 44: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/44.jpg)
Frame Buffer Objects
• Also works with multiple render targets
![Page 45: GLSL Programming - MAVERICKmaverick.inria.fr/~Nicolas.Holzschuch/cours/Slides/2b...New data types • vec4: a 4-component floating-point array • also vec2, vec3, ivec4... • mat4:](https://reader034.vdocuments.site/reader034/viewer/2022042103/5e8116ba9e34d9005250491f/html5/thumbnails/45.jpg)
That’s all!