30
ñĕĈðĎăéùïõi |5* 1Q (3)

ゲームグラフィックス特論 第5回

  • Upload
    -

  • View
    2.094

  • Download
    2

Embed Size (px)

DESCRIPTION

モーフィング,バーテックスブレンディング

Citation preview

Page 1: ゲームグラフィックス特論 第5回

5 (3)

Page 2: ゲームグラフィックス特論 第5回

2

Page 3: ゲームグラフィックス特論 第5回

3

Page 4: ゲームグラフィックス特論 第5回

4

(0, 0)

(1, 1)

s

t

CPU

Page 5: ゲームグラフィックス特論 第5回

5

ccoossφφcosφy

O x x

z

OO θccoossθθcosθ

ssiinnθθsinθ

φ

ssiinnφφsinφ

ssiinnφφsinφ

Page 6: ゲームグラフィックス特論 第5回

#version 150 core !in vec2 parameter; // CPU !uniform mat4 mc; // ! !void main(void) !{ ! float th = 6.283185 * parameter.s; // [0,1]→[0,2π] ! float ph = 3.141593 * parameter.t; // [0,1]→[0,π] ! float r = sin(ph); !! vec4 p = vec4(r * cos(th), cos(ph), r * sin(th), 1.0); ! ! gl_Position = mc * p; !}

6

Page 7: ゲームグラフィックス特論 第5回

7

y

O x x

z

OO θccoossθθcosθ

ssiinnθθsinθ

h

Page 8: ゲームグラフィックス特論 第5回

#version 150 core !in vec2 parameter; // CPU !uniform mat4 mc; // !!void main(void) !{ ! float th = 6.283185 * parameter.s; // [0,1]→[0,2π] ! float y = parameter.t * 2.0 - 1.0; // [0,1]→[-1,1] !! vec4 p = vec3(cos(th), y, sin(th), 1.0); !! gl_Position = mc * p; !} !

8

Page 9: ゲームグラフィックス特論 第5回

9

Page 10: ゲームグラフィックス特論 第5回

•  • 

•  • 

• 

•  •  • 

•  •  CPU

•  (attribute)

GPU

10

Page 11: ゲームグラフィックス特論 第5回

•  • 

• 

11

P0

P1

t = t0t = t1

P(t)t

Page 12: ゲームグラフィックス特論 第5回

12

t0 t1 t

P0

P1

P(t)

t ∈ t0, t1[ ]s t( ) = t − t0( ) t1 − t0( )P t( ) = 1− s t( )( )P0 + s t( )P1

Page 13: ゲームグラフィックス特論 第5回

#version 150 core !in vec4 p0, p1; // !uniform float t; // !uniform mat4 mc; // !void main(void) !{ ! gl_Position = mc * mix(p0, p1, t); !} !!

13

Page 14: ゲームグラフィックス特論 第5回

// program = glCreateProgram(); ! … ( , , ) // in (attribute) p1 -1GLint p1Loc = glGetAttribLocation(program, "p1"); !!// p1 GLuint p1Buf; !glGenBuffers(1, &p1Buf); !glBindBuffer(GL_ARRAY_BUFFER, p1Buf); !glBufferData(GL_ARRAY_BUFFER, ! sizeof (GLfloat[3]) * vertices, p1, GL_STATIC_DRAW); !

attribute

14

Page 15: ゲームグラフィックス特論 第5回

// glBindVertexArray(vao); !!// in (attribute) p1 glBindBuffer(GL_ARRAY_BUFFER, p1Buf); !glVertexAttribPointer(p1Loc, 3, GL_FLOAT, GL_FALSE, 0, 0); !glEnableVertexAttribArray(p1Loc); !!// glDrawElements(GL_LINES, lines, GL_UNSIGNED_INT, 0); !

15

Page 16: ゲームグラフィックス特論 第5回

Pi

P1

Pk

PN PDiDk

D1

16

Di = Pi −PN

PN: Pi: Di: wi: i

P = PN + wiDii=1

k

Page 17: ゲームグラフィックス特論 第5回

17

Page 18: ゲームグラフィックス特論 第5回

M1

M2

• 

18

Page 19: ゲームグラフィックス特論 第5回

• 

• 

• 

• 

19

Page 20: ゲームグラフィックス特論 第5回

M1

M2

��������

• 

• 

• 

20

Page 21: ゲームグラフィックス特論 第5回

M1

M2

BlendM1 and M2

• 

•  M1 M2

• M1

M2

21

Page 22: ゲームグラフィックス特論 第5回

O

1

z

x

M1

M0

B1(t)

B0(t)

P u(t)

22

M0, M1 B0(t), B1(t)

Page 23: ゲームグラフィックス特論 第5回

23

O

z

xB1(t) PM1

B0(t) PM0

P u(t)z

x

PM0

O

PM1

u(t) = w0B0(t)M0 P + w1B1(t)M1 P

w0

w1

P

Page 24: ゲームグラフィックス特論 第5回

24

• 

•  c •  d w

• 

•  n

w =1

(d+ 1)c

u (t) =n�1X

i=0

wiB (t)M�1i P

n�1X

i=0

wi = 1, wi � 0P0

P1

d

P

Page 25: ゲームグラフィックス特論 第5回

P0

P1

P0

P1

P

P

t

t > 1d

d

25

V1 = P1 −P0V2 = P−P0

t = V1 ⋅V2V12

d = V2 −V1t

d =V2

V2 −V1tV2 −V1

"

#$

%$

t ≤ 0( )0 < t <1( )t ≥1( )

Page 26: ゲームグラフィックス特論 第5回

#version 150 core !in vec4 position; // !uniform mat4 modelViewMatrix; // !uniform mat4 projectionMatrix; // !!// const int MAXBONES = 8; !uniform int numberOfBones; // !uniform vec4 p0[MAXBONES]; // !uniform vec4 p1[MAXBONES]; // !uniform mat4 blendMatrix[MAXBONES]; // Bi * inverse(Mi) CPU !const float exponent = -16.0; // !!void main() !{ ! vec4 p = modelViewMatrix * position, u = vec4(0.0); ! for (int i = 0; i < numberOfBones; ++i) { ! vec4 v1 = p1[i] – p0[i], v2 = p – p0[i]; ! float l = dot(v1, v1); ! if (l > 0.0) v2 -= v1 * clamp(dot(v1, v2) / l, 0.0, 1.0); ! u += pow(length(v2) + 1.0, exponent) * blendMatrix[i] * p; // ! } ! gl_Position = projectionMatrix * u; !} !

26

Page 27: ゲームグラフィックス特論 第5回

GLSL •  sin(x), cos(x)

•  , x (radian) ,

•  pow(x, y) •  , xy

• mix(v1, v2, t) •  v1 v2 t v1 * (1 - t) + v2 * t

•  dot(v1, v2) •  v1, v2 , cross(v1, v2)

•  length(v) •  v

•  clamp(v, min, max) •  , v<min min, v>max max, v

27

Page 28: ゲームグラフィックス特論 第5回

•  P0, P1 P d

28

V1 = P1 −P0V2 = P−P0

t = V1 ⋅V2V12

d = V2 −V1t V2

V1

Pt

dQ

P0

P1

Page 29: ゲームグラフィックス特論 第5回

• 

•  https://github.com/tokoik/ggsample05

•  cylinder.h p0

•  p1

• main.cpp p1 GPU simple.vert

• main.cpp simple.vert

•  [email protected]

29

Page 30: ゲームグラフィックス特論 第5回

30