Introduction to Computer Graphics
April 6, 2017 Kenshi Takayama
Introduction to Computer Graphics April 6, 2017 Kenshi Takayama - - PowerPoint PPT Presentation
Introduction to Computer Graphics April 6, 2017 Kenshi Takayama Lecturers Kenshi Takayama (Assistant Prof., NII) http://research.nii.ac.jp/~takayama/ takayama@nii.ac.jp Toshiya Hachisuka (Junior Associate Prof.)
April 6, 2017 Kenshi Takayama
Ag3RwxUAAAAJ&hl=en
2
TA:Seung-Tak Noh (Igarashi Lab)
https://sites.google.com/site/seungt aknoh/home
seungtak.noh@gmail.com
3
Modeling Animation Rendering Image processing
and the overall balance in the class
4
5
6
7
8
0, 1 𝑏, 𝑑 𝑐, 𝑒 1, 0
9
10
11
𝑆 = cos 𝜄 − sin 𝜄 sin 𝜄 cos 𝜄 1 𝑈 = 1 𝑢x 1 𝑢y 1
12
Orthographic projection Perspective projection
𝑦 𝑥 , 𝑧 𝑥 , 𝑨 𝑥
𝑞x 𝑞z , 𝑞x 𝑞z
13
Projection matrix
1 1 1 1 1 𝑞x 𝑞y 𝑞z 1 = 𝑞x 𝑞y 𝑞z + 1 𝑞z ≡ 𝑞x/𝑞z 𝑞y/𝑞z 1 + 1/𝑞z 1 𝑥x 𝑥y 𝑥z
Z X Z=1
14
Orthographic Perspective
15
Local coord. system Object (world) coord. system Window coord. system x y w h Modelview trans. (4x4 matrix) Viewport trans. (x, y, w, h) Projection trans. (4x4 matrix) Camera coord. system Projected coord. system
16
glViewport(0, 0, 640, 480); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective( 45.0, // field of view 640 / 480, // aspect ratio 0.1, 100.0); // depth range glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt( 0.5, 0.5, 3.0, // view point 0.0, 0.0, 0.0, // focus point 0.0, 1.0, 0.0); // up vector glBegin(GL_LINES); glColor3d(1, 0, 0); glVertex3d(0, 0, 0); glVertex3d(1, 0, 0); glColor3d(0, 1, 0); glVertex3d(0, 0, 0); glVertex3d(0, 1, 0); glColor3d(0, 0, 1); glVertex3d(0, 0, 0); glVertex3d(0, 0, 1); glEnd(); Projection transform Modelview transform Scene content Viewport transform Output
17
18
With hidden surface removal Without hidden surface removal
19
20
21
22
Without polygon offset With polygon offset
Larger drawing space, less accuracy
More accuracy, smaller drawing space (clipped)
23
gluPerspective( 45.0, // field of view 640 / 480, // aspect ratio 0.1, 1000.0); // zNear, zFar zNear=0.0001 zFar =1000 zNear=50 zFar =100
24
Purpose Z-buffering (OpenGL / DirectX) Idea
Hidden surface removal
Real-time CG (games) Per-polygon processing
One polygon updates multiple pixels
High-quality CG (movies) Per-pixel (ray) processing
One ray interacts with multiple polygons
By nature More details by Prof. Hachisuka
25
26
about X-axis about Y-axis about Z-axis about arbitrary axis Degree of Freedom
𝑣𝑦, 𝑣𝑧, 𝑣𝑨 : axis vector
27
𝑏2, 𝑐2 = 𝑏1𝑏2 − 𝑐1𝑐2 + 𝑏1𝑐2 + 𝑐1𝑏2 𝐣
𝑏2, 𝑐2, 𝑑2, 𝑒2 = 𝑏1𝑏2 − 𝑐1𝑐2 − 𝑑1𝑑2 − 𝑒1𝑒2 + 𝑏1𝑐2 + 𝑐1𝑏2 + 𝑑1𝑒2 − 𝑒1𝑑2 𝐣 + 𝑏1𝑑2 + 𝑑1𝑏2 + 𝑒1𝑐2 − 𝑐1𝑒2 𝐤 + 𝑏1𝑒2 + 𝑒1𝑏2 + 𝑐1𝑑2 − 𝑑1𝑐2 𝐥
28
Not commutative!
29
30
Note: 𝑣 is a unit vector
1 − 𝑢 𝐫1 + 𝑢 𝐫2
sin 1−𝑢 Ω sin Ω
𝐫1 +
sin 𝑢Ω sin Ω 𝐫2
31
Animating rotation with quaternion curves. Shoemake, SIGGRAPH 1985 http://number-none.com/product/Understanding%20Slerp,%20Then%20Not%20Using%20It/
q2 q1 1–t slerp(t ) t q2 q1 nlerp(t ) 1–t t
𝜄 2 + 𝑣 sin 𝜄 2
𝜄−2𝜌 2
+ 𝑣 sin
𝜄−2𝜌 2
= −𝐫
32
33
34
35
Prepare arrays, send them to GPU, draw them using custom shaders
36
Immediate mode Polygonal primitives Light & material
Display list Default shaders Shaders Shader variables Arrays Drawing
for Embedded Systems
glBegin, glVertex, glColor, glTexCoord GL_QUADS, GL_POLYGON glLight, glMaterial GL_MODELVIEW, GL_PROJECTION glNewList glCreateShader, glShaderSource, glCompileShader, glCreateProgram, glAttachShader, glLinkProgram, glUseProgram glGetAttribLocation, glEnableVertexAttribArray, glGetUniformLocation, glUniform glCreateBuffer, glBindBuffer, glBufferData, glVertexAttribPointer glDrawArrays
37
<html><head> <title>Learning WebGL — lesson 1</title> <script type="text/javascript" src="glMatrix-0.9.5.min.js"></script> <script id="shader-fs" type="x-shader/x-fragment"> precision mediump float; void main(void) { gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); } </script> <script id="shader-vs" type="x-shader/x-vertex"> attribute vec3 aVertexPosition; uniform mat4 uMVMatrix; uniform mat4 uPMatrix; void main(void) { gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0); } </script> <script type="text/javascript"> var gl; function initGL(canvas) { gl = canvas.getContext("experimental-webgl"); gl.viewportWidth = canvas.width; gl.viewportHeight = canvas.height; } function getShader(gl, id) { var shaderScript = document.getElementById(id); var str = ""; var k = shaderScript.firstChild; while (k) { if (k.nodeType == 3) { str += k.textContent; } k = k.nextSibling; } var shader; if (shaderScript.type == "x-shader/x-fragment") { shader = gl.createShader(gl.FRAGMENT_SHADER); } else if (shaderScript.type == "x-shader/x-vertex") { shader = gl.createShader(gl.VERTEX_SHADER); } gl.shaderSource(shader, str); gl.compileShader(shader); return shader; } var shaderProgram; function initShaders() { var fragmentShader = getShader(gl, "shader-fs"); var vertexShader = getShader(gl, "shader-vs"); shaderProgram = gl.createProgram(); gl.attachShader(shaderProgram, vertexShader); gl.attachShader(shaderProgram, fragmentShader); gl.linkProgram(shaderProgram); gl.useProgram(shaderProgram); shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition"); gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute); shaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, "uPMatrix"); shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix"); } var mvMatrix = mat4.create(); var pMatrix = mat4.create(); var vertices = [ 0.0, 1.0, 0.0,
1.0, -1.0, 0.0 ]; gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); triangleVertexPositionBuffer.itemSize = 3; triangleVertexPositionBuffer.numItems = 3; squareVertexPositionBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer); vertices = [ 1.0, 1.0, 0.0,
1.0, -1.0, 0.0,
]; gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); squareVertexPositionBuffer.itemSize = 3; squareVertexPositionBuffer.numItems = 4; } function drawScene() { gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); mat4.perspective(45, 1.5, 0.1, 100.0, pMatrix); mat4.identity(mvMatrix); mat4.translate(mvMatrix, [-1.5, 0.0, -7.0]); gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer); gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, triangleVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0); setMatrixUniforms(); gl.drawArrays(gl.TRIANGLES, 0, triangleVertexPositionBuffer.numItems); mat4.translate(mvMatrix, [3.0, 0.0, 0.0]); gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer); gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, squareVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0); setMatrixUniforms(); gl.drawArrays(gl.TRIANGLE_STRIP, 0, squareVertexPositionBuffer.numItems); } function webGLStart() { var canvas = document.getElementById("lesson01-canvas"); initGL(canvas); initShaders(); initBuffers(); gl.clearColor(0.0, 0.0, 0.0, 1.0); gl.enable(gl.DEPTH_TEST); drawScene(); } </script></head> <body onload="webGLStart();"> <canvas id="lesson01-canvas" style="border: none;" width="500" height="500"> </canvas> </body> </html>
#include <GL/glut.h> void disp( void ) { float f; glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); for(f = 0 ; f < 1 ; f += 0.1) { glColor3f(f , 0 , 0); glCallList(1); } glPopMatrix(); glFlush(); } void setDispList( void ) { glNewList(1, GL_COMPILE); glBegin(GL_POLYGON); glVertex2f(-1.2 , -0.9); glVertex2f(0.6 , -0.9); glVertex2f(-0.3 , 0.9); glEnd(); glTranslatef(0.1 , 0 , 0); glEndList(); } int main(int argc , char ** argv) { glutInit(&argc , argv); glutInitWindowSize(400 , 300); glutInitDisplayMode(GLUT_RGBA); glutCreateWindow("Kitty on your lap"); glutDisplayFunc(disp); setDispList(); glutMainLoop(); }
http://wisdom.sakura.ne.jp/system/opengl/gl20.html http://learningwebgl.com/blog/?p=28
WebGL C / OpenGL 1.x
38
<script src="js/three.min.js"></script> <script> var camera, scene, renderer, geometry, material, mesh; function init() { scene = new THREE.Scene(); camera = new THREE.PerspectiveCamera( 75, 640 / 480, 1, 10000 ); camera.position.z = 1000; geometry = new THREE.BoxGeometry( 200, 200, 200 ); material = new THREE.MeshBasicMaterial({color:0xff0000, wireframe:true}); mesh = new THREE.Mesh( geometry, material ); scene.add( mesh ); renderer = new THREE.WebGLRenderer(); renderer.setSize(640, 480); document.body.appendChild( renderer.domElement ); } function animate() { requestAnimationFrame( animate ); render(); } function render() { mesh.rotation.x += 0.01; mesh.rotation.y += 0.02; renderer.render( scene, camera ); } init(); animate(); </script>
three.js High-level API
39
40
https://thimble.mozilla.org/
41
after coordinate transformation (gl_Position)
42
Vertex shader Fragment shader
(Grammar differs slightly with versions)
43
precision mediump float; varying vec3 v_color; void main(void) { gl_FragColor.rgb = v_color; gl_FragColor.a = 1.0; } uniform mat4 u_modelview; uniform mat4 u_projection; attribute vec3 a_vertex; attribute vec3 a_color; varying vec3 v_color; void main(void) { gl_Position = u_projection * u_modelview * vec4(a_vertex, 1.0); v_color = a_color; }
Vertex shader Fragment shader
44
console.log(x)
x.abc x["abc"] { abc : y } { "abc" : y } .length .push() .forEach() .pop()
https://www.opengl.org/sdk/docs/man/html/indexflat.php
http://learningwebgl.com/blog/?p=11
https://www.khronos.org/registry/webgl/specs/1.0/#5.14
http://casual-effects.blogspot.jp/2014/01/
http://effectivejs.com/
45
46