The OpenGL API Patrick Cozzi University of Pennsylvania CIS 565 - Fall 2012.

Slides:



Advertisements
Similar presentations
POST-PROCESSING SET09115 Intro Graphics Programming.
Advertisements

COMPUTER GRAPHICS CS 482 – FALL 2014 NOVEMBER 10, 2014 GRAPHICS HARDWARE GRAPHICS PROCESSING UNITS PARALLELISM.
GlTF and rest3d Patrick Cozzi University of Pennsylvania CIS Fall 2013.
GLSL Basics Discussion Lecture for CS 418 Spring 2015 TA: Zhicheng Yan, Sushma S Kini, Mary Pietrowicz.
Status – Week 257 Victor Moya. Summary GPU interface. GPU interface. GPU state. GPU state. API/Driver State. API/Driver State. Driver/CPU Proxy. Driver/CPU.
Graphics Hardware CMSC 435/634. Transform Shade Clip Project Rasterize Texture Z-buffer Interpolate Vertex Fragment Triangle A Graphics Pipeline.
Prepared 5/24/2011 by T. O’Neil for 3460:677, Fall 2011, The University of Akron.
Informationsteknologi Wednesday, December 12, 2007Computer Graphics - Class 171 Today’s class OpenGL Shading Language.
MAT 594CM S10Fundamentals of Spatial ComputingAngus Forbes Week 4 : GLSL Shaders Topics: Shader programs, vertex & fragment shaders, passing data into.
GLSL Applications: 1 of 2 Joseph Kider Source: Patrick Cozzi – Spring 2011 University of Pennsylvania CIS Fall 2011.
Introduction to OpenGL Joseph Kider University of Pennsylvania CIS 565 – Fall 2011 (Source: Patrick Cozzi)
© David Kirk/NVIDIA and Wen-mei W. Hwu, ECE408, University of Illinois, Urbana-Champaign 1 Programming Massively Parallel Processors Chapter.
OpenGL Help Session CS248 Fall 2006 Zhengyun Zhang.
Introduction to OpenGL. What is OpenGL OpenGL is a low-level software interface to graphics hardware No commands for performing windowing tasks or obtaining.
Open Graphics Library (OpenGL)
GPU Graphics Processing Unit. Graphics Pipeline Scene Transformations Lighting & Shading ViewingTransformations Rasterization GPUs evolved as hardware.
OpenGL. Textures  Bind Textures similar to binding VBO’s  Create a texture for each object  Generate the texture similar how you generate a VBO buffer.
GAM532 DPS932 – Week 1 Rendering Pipeline and Shaders.
WebGL Patrick Cozzi University of Pennsylvania CIS Spring 2012.
OpenGL 3.0 Texture Arrays Presentation: Olivia Terrell, Dec. 4, 2008.
WebGL: Hands On Zhenyao Mo Software Engineer, Google, Inc. Chrome GPU Team.
CS 480/680 Computer Graphics Course Overview Dr. Frederick C Harris, Jr. Fall 2012.
Real-time Graphical Shader Programming with Cg (HLSL)
Geometric Objects and Transformations. Coordinate systems rial.html.
CS 418: Interactive Computer Graphics Introduction to WebGL: HelloTriangle.html Eric Shaffer.
OpenGL Shading Language (Advanced Computer Graphics) Ernest Tatum.
WebGL: in-browser 3D graphics Nick Whitelegg Maritme and Technology Faculty Southampton Solent University.
1 Introduction to Computer Graphics SEN Introduction to OpenGL Graphics Applications.
Computer Graphics I, Fall 2008 Introduction to Computer Graphics.
Real-Time High Quality Rendering CSE 291 [Winter 2015], Lecture 4 Brief Intro to Programmable Shaders
CS 4363/6353 OPENGL BACKGROUND. WHY IS THIS CLASS SO HARD TO TEACH? (I’LL STOP WHINING SOON) Hardware (GPUs) double in processing power ever 6 months!
GPU Shading and Rendering: OpenGL Shading Language Marc Olano UMBC.
OpenGL Buffer Transfers Patrick Cozzi University of Pennsylvania CIS Spring 2012.
CS662 Computer Graphics Game Technologies Jim X. Chen, Ph.D. Computer Science Department George Mason University.
OpenGL and WebGL Patrick Cozzi University of Pennsylvania CIS Fall 2013.
OpenGL Shader Language Vertex and Fragment Shading Programs.
Final Project Ideas Patrick Cozzi University of Pennsylvania CIS Fall 2013.
Shaders in OpenGL Marshall Hahn. Introduction to Shaders in OpenGL In this talk, the basics of OpenGL Shading Language will be covered. This includes.
Patrick Cozzi University of Pennsylvania CIS Fall 2014
CS418 Computer Graphics John C. Hart
OpenGL Shading Language (GLSL)
CSE 381 – Advanced Game Programming GLSL. Rendering Revisited.
OpenGL Shading Language (GLSL)
Mobile Graphics Patrick Cozzi University of Pennsylvania CIS Spring 2012.
Computer Graphics 3 Lecture 6: Other Hardware-Based Extensions Benjamin Mora 1 University of Wales Swansea Dr. Benjamin Mora.
CS 480/680 Computer Graphics Programming with Open GL Part 5: Putting it all together Dr. Frederick C Harris, Jr. Fall 2011.
Programming with OpenGL Part 5: More GLSL Isaac Gang University of Mary Hardin-Baylor E. Angel and D. Shreiner: Interactive Computer Graphics 6E © Addison-Wesley.
Maths & Technologies for Games Graphics Optimisation - Batching CO3303 Week 5.
Ray Tracing using Programmable Graphics Hardware
OpenGL Shading Language (GLSL)
OpenGl Shaders Lighthouse3d.com.
GLSL I.  Fixed vs. Programmable  HW fixed function pipeline ▪ Faster ▪ Limited  New programmable hardware ▪ Many effects become possible. ▪ Global.
An Introduction to the Cg Shading Language Marco Leon Brandeis University Computer Science Department.
COMP 175 | COMPUTER GRAPHICS Remco Chang1/XX13 – GLSL Lecture 13: OpenGL Shading Language (GLSL) COMP 175: Computer Graphics April 12, 2016.
Directions in Linux OpenGL
Graphics on GPU © David Kirk/NVIDIA and Wen-mei W. Hwu,
Graphics Processing Unit
Chapter 6 GPU, Shaders, and Shading Languages
OpenGL ARB Superbuffers
Chapter VI OpenGL ES and Shader
Graphics Processing Unit
Introduction to Shaders
Programming with OpenGL Part 5: More GLSL
Mickaël Sereno Shaders Mickaël Sereno 25/04/2019 Mickaël Sereno -
CIS 441/541: Introduction to Computer Graphics Lecture 15: shaders
Programming with OpenGL Part 5: More GLSL
CS 480/680 Computer Graphics GLSL Overview.
OpenGL Background CS 4722.
CS 480/680 Fall 2011 Dr. Frederick C Harris, Jr. Computer Graphics
CIS 6930: Chip Multiprocessor: GPU Architecture and Programming
Presentation transcript:

The OpenGL API Patrick Cozzi University of Pennsylvania CIS Fall 2012

Agenda Today: OpenGL shaders and uniforms Later: efficient buffer usage

OpenGL Is a C-based API Is cross platform Is run by the ARB: Architecture Review Board Hides the device driver details OpenGL vs. Direct3D

OpenGL We are using GL 2  No fixed function vertex and fragment shading  No legacy API calls: glBegin() glRotatef() glTexEnvf() AlphaFunc() … Why was the alpha test remove?Recall the fixed function light map

OpenGL GPU Device Driver OpenGL API Application Software stack:

OpenGL Major objects: Shader Programs Textures Framebuffers Shader Objects Array Buffers Fixed Function State Element Buffers Pixel Buffers Renderbuffers We are not covering everything. Just surveying the most relevant parts for writing GLSL shaders

Shaders Shader object: an individual vertex, fragment, etc. shader  Are provided shader source code as a string  Are compiled Shader program: Multiple shader objects linked together

Shader Objects const char *source = //... GLint sourceLength = //... GLuint v = glCreateShader(GL_VERTEX_SHADER); glShaderSource(v, 1, &source, &sourceLength); glCompileShader(v); GLint compiled; glGetShaderiv(v, GL_COMPILE_STATUS, &compiled); // success: compiled == GL_TRUE //... glDeleteShader(v); Compile a shader object:

Shader Objects const char *source = //... GLint sourceLength = //... GLuint v = glCreateShader(GL_VERTEX_SHADER); glShaderSource(v, 1, &source, &sourceLength); glCompileShader(v); GLint compiled; glGetShaderiv(v, GL_COMPILE_STATUS, &compiled); // success: compiled == GL_TRUE //... glDeleteShader(v); Compile a shader object: v is an opaque object What is it under the hood? How would you design this in C++? OpenGL functions start with gl. Why? How would you design this in C++?

Shader Objects const char *source = //... GLint sourceLength = //... GLuint v = glCreateShader(GL_VERTEX_SHADER); glShaderSource(v, 1, &source, &sourceLength); glCompileShader(v); GLint compiled; glGetShaderiv(v, GL_COMPILE_STATUS, &compiled); // success: compiled == GL_TRUE //... glDeleteShader(v); Compile a shader object: Provide the shader’s source code Where should the source come from? Why can we pass more than one string?

Shader Objects const char *source = //... GLint sourceLength = //... GLuint v = glCreateShader(GL_VERTEX_SHADER); glShaderSource(v, 1, &source, &sourceLength); glCompileShader(v); GLint compiled; glGetShaderiv(v, GL_COMPILE_STATUS, &compiled); // success: compiled == GL_TRUE //... glDeleteShader(v); Compile a shader object: Compile, but what does the driver really do?

Shader Objects const char *source = //... GLint sourceLength = //... GLuint v = glCreateShader(GL_VERTEX_SHADER); glShaderSource(v, 1, &source, &sourceLength); glCompileShader(v); GLint compiled; glGetShaderiv(v, GL_COMPILE_STATUS, &compiled); // success: compiled == GL_TRUE //... glDeleteShader(v); Compile a shader object: Good developers check for error. Again, how would you design this in C++? Calling glGet* has performance implications. Why?

Shader Objects const char *source = //... GLint sourceLength = //... GLuint v = glCreateShader(GL_VERTEX_SHADER); glShaderSource(v, 1, &source, &sourceLength); glCompileShader(v); GLint compiled; glGetShaderiv(v, GL_COMPILE_STATUS, &compiled); // success: compiled == GL_TRUE //... glDeleteShader(v); Compile a shader object: Good developers also cleanup resources

Shader Programs GLuint v = glCreateShader(GL_VERTEX_SHADER); GLuint f = glCreateShader(GL_FRAGMENT_SHADER); //... GLuint p = glCreateProgram(); glAttachShader(p, v); glAttachShader(p, f); glLinkProgram(p); GLint linked; glGetShaderiv(p, GL_LINK_STATUS, &linked); // success: linked == GL_TRUE //... glDeleteProgram(v); Link a shader program:

Shader Programs GLuint v = glCreateShader(GL_VERTEX_SHADER); GLuint f = glCreateShader(GL_FRAGMENT_SHADER); //... GLuint p = glCreateProgram(); glAttachShader(p, v); glAttachShader(p, f); glLinkProgram(p); GLint linked; glGetShaderiv(p, GL_LINK_STATUS, &linked); // success: linked == GL_TRUE //... glDeleteProgram(v); Link a shader program: A program needs a vertex and fragment shader

Shader Programs GLuint v = glCreateShader(GL_VERTEX_SHADER); GLuint f = glCreateShader(GL_FRAGMENT_SHADER); //... GLuint p = glCreateProgram(); glAttachShader(p, v); glAttachShader(p, f); glLinkProgram(p); GLint linked; glGetShaderiv(p, GL_LINK_STATUS, &linked); // success: linked == GL_TRUE //... glDeleteProgram(v); Link a shader program:

Shader Programs GLuint v = glCreateShader(GL_VERTEX_SHADER); GLuint f = glCreateShader(GL_FRAGMENT_SHADER); //... GLuint p = glCreateProgram(); glAttachShader(p, v); glAttachShader(p, f); glLinkProgram(p); GLint linked; glGetShaderiv(p, GL_LINK_STATUS, &linked); // success: linked == GL_TRUE //... glDeleteProgram(v); Link a shader program: Be a good developer again

Using Shader Programs GLuint p = glCreateProgram(); //... glUseProgram(p); glDraw*(); // * because there are lots of draw functions Part of the current state How do you draw different objects with different shaders? What is the cost of using multiple shaders? How do we reduce the cost? Hint: write more CPU code – really.

Uniforms GLuint p = glCreateProgram(); //... glLinkProgram(p); GLuint m = glGetUniformLocation(p, “u_modelViewMatrix”); GLuint l = glGetUniformLocation(p, “u_lightMap”); glUseProgram(p); mat4 matrix = //... glUniformMatrix4fv(m, 1, GL_FALSE, &matrix[0][0]); glUniform1i(l, 0);

Uniforms GLuint p = glCreateProgram(); //... glLinkProgram(p); GLuint m = glGetUniformLocation(p, “u_modelViewMatrix”); GLuint l = glGetUniformLocation(p, “u_lightMap”); glUseProgram(p); mat4 matrix = //... glUniformMatrix4fv(m, 1, GL_FALSE, &matrix[0][0]); glUniform1i(l, 0); Each active uniform has an integer index location.

Uniforms GLuint p = glCreateProgram(); //... glLinkProgram(p); GLuint m = glGetUniformLocation(p, “u_modelViewMatrix”); GLuint l = glGetUniformLocation(p, “u_lightMap”); glUseProgram(p); mat4 matrix = //... glUniformMatrix4fv(m, 1, GL_FALSE, &matrix[0][0]); glUniform1i(l, 0); mat4 is part of the C++ GLM library GLM:

Uniforms GLuint p = glCreateProgram(); //... glLinkProgram(p); GLuint m = glGetUniformLocation(p, “u_modelViewMatrix”); GLuint l = glGetUniformLocation(p, “u_lightMap”); glUseProgram(p); mat4 matrix = //... glUniformMatrix4fv(m, 1, GL_FALSE, &matrix[0][0]); glUniform1i(l, 0); Uniforms can be changed as often as needed, but are constant during a draw call Not transposing the matrix glUniform* for all sorts of datatypes

Uniforms GLuint p = glCreateProgram(); //... glLinkProgram(p); GLuint m = glGetUniformLocation(p, “u_modelViewMatrix”); GLuint l = glGetUniformLocation(p, “u_lightMap”); glUseProgram(p); mat4 matrix = //... glUniformMatrix4fv(m, 1, GL_FALSE, &matrix[0][0]); glUniform1i(l, 0); Why not glUniform*(p, …) ?