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

20
³ÓɲÍƬ¾±¹Sm Z14" ¸°ÊÁη®Ó½

Upload: -

Post on 04-Jun-2015

2.211 views

Category:

Education


0 download

DESCRIPTION

geometry shader

TRANSCRIPT

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

³ÓɲÍƬ¾±¹Sm�Z14"�¸°ÊÁη®Ó½�

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

$G#3�\�� �GPU �v�$G#3«V:�©�

2

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

¸°ÊÁη®Ó½�5��

3

GPU

GPUCPU

バーテックスシェーダ ラスタライザ

CPU

バーテックスシェーダ ラスタライザ

ジオメトリシェーダ

外部バス

外部バス

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

OpenGL �$G#3�

4

0

1

2

3

4

5

0

12

34

5

0

1

2

3

4

5

0

1

2

3

4

5

0

1

2

3

4

5

0

1

2

3

4

5

0

1

2

3

4

5

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

s��ª�$G#3�

0

12

34

5

!"#$%&'(!")#*$%&+#',-'.)(./

0

1

2

3 45

6

7

0

1

2

3 45

6

7

0

12 3

4

5

6

7

8

91011

6

78

910

11

!"#$%&'(!")*#',-'.)(./

!"#"&()#*$%&+#',-'.)(./!"#"&()*#',-'.)(./

5

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

¸°ÊÁη®Ó½�������

6

��� �

���� �

GL_LINES GL_LINES_ADJACENCY GL_TRIANGLES

GL_POINTS GL_LINE_STRIP

GL_TRIANGLES_ADJACENCY

GL_TRIANGLE_STRIP

��������

GL_POINTS

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

>X#3�¸°ÊÁη®Ó½����

7

描画する基本図形GL_LINE_STRIP

入力基本図形GL_LINES

出力基本図形GL_LINE_STRIP

ジオメトリシェーダ

バーテックスシェーダ 0

1

2

3

4

0

1 1

2 2

3 3

4

0

1 1

2 2

3 3

4

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

=+�a���$G#3�

,|�>X�©$G#3� =+�a���$G#3� ~P@�

GL_POINTS� GL_POINTS� 1�

GL_LINES�

GL_LINES� 2�GL_LINE_STRIP�

GL_LINE_LOOP�

GL_LINES_ADJACENCY�GL_LINES_ADJACENCY� 4�

GL_LINE_STRIP_ADJACENCY�

GL_TRIANGLES�

GL_TRIANGLES� 3�GL_TRIANGLE_FAN�

GL_TRIANGLE_STRIP�

GL_TRIANGLES_ADJACENCY�GL_TRIANGLES_ADJACENCY� 6�

GL_TRIANGLE_STRIP_ADJACENCY�

8

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

¸°ÊÁη®Ó½����a�~P@�

• ¸°ÊÁη®Ó½�����©~P@���y��© •  GLint vertices, components; !

• ~P@��y���6 •  glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES, &vertices);

• h[@��y���6 •  glGetIntegerv(GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS, &components);

• ���~P��g@�~P08«j+��© •  (��~P08«<���©�����©~P@�M© •  components÷(~P08�h[@) ��vertices �/��A�

9

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

¸°ÊÁη®Ó½� Wj+� // ¸°ÊÁη®Ó½�»Ó¹ÇѲÍÉ�l£r£�´ÒÄ­Ï ! …ÔÃÓ¿¾±¹·®Ó½ØÆͲÊÒÁ·®Ó½� �Õ !! // ¸°ÊÁη®Ó½����©$G#3�=+ ! glProgramParameteri(program, GL_GEOMETRY_INPUT_TYPE, input); ! // ¸°ÊÁη®Ó½�§���©$G#3�=+ ! glProgramParameteri(program, GL_GEOMETRY_OUTPUT_TYPE, output); ! // ¸°ÊÁη®Ó½����a�~P@�h[@ ! GLint vertices, components; ! // ¸°ÊÁη®Ó½����a�~P@�E)�«6© ! glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES, &vertices); ! // ¸°ÊÁη®Ó½����a�h[@�E)�«6© ! glGetIntegerv(GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS, &components); ! components /= 12; // ¸°ÊÁη®Ó½��out &@��vec4 × 3 ��� ! // ¸°ÊÁη®Ó½����©~P�E)@«j+�© ! if (vertices > components) vertices = components; ! glProgramParameteri(program, GL_GEOMETRY_VERTICES_OUT, vertices); !! // ·®Ó½ÇѲÍÉ�ÎÒ±! … !

10

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

¸°ÊÁη®Ó½� Wj+�fp�

• GL_MAX_GEOMETRY_OUTPUT_VERTICES �¦¨6§ª©~P@� 1024 ��)�����©�Ö�ª«��¢¢ GL_GEOMETRY_VERTICES_OUT �j+�©��xu� •  ÎÒ±C�¯ÍÓ��§����§(�ÂÍ­Ã�ò�•  6§ª©~P@��EmitVertex() «,d��©E)�

• GL_GEOMETRY_VERTICES_OUT �j+��©��¸°ÊÁη®Ó½� ���© out &@�@�¤�*�© •  EmitVertex() «,d�©�¡� out &@W�и¹¼�Ko�ª©

• ¸°ÊÁη®Ó½����$G#3¥E)��~P@�·®Ó½ÇÑÍÉ��j+��©¦������©

11

layout(triangles) in; !layout(triangle_strip, max_vertices = 10) out; !

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

ÃÓ¿¾±¹·®Ó½�#version 150 core !#extension GL_ARB_explicit_attrib_location : enable !!uniform mat4 mc; // ËÀÏÅÌÓ;4&? !!layout (location = 0) in vec4 pv; // ~P�_!layout (location = 1) in vec4 cv; // ~Pc!!out vec4 vc; // ¸°ÊÁη®Ó½�t©~Pc !!void main(void) !{ ! vc = cv; // ~Pc«¸°ÊÁη®Ó½�t© ! gl_Position = mc * pv; // ~P�_«¸°ÊÁη®Ó½�t© !} !�

12

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

¸°ÊÁη®Ó½�#version 150 core !!layout (triangles) in; !layout (triangle_strip, max_vertices = 16) out; !!in vec4 vc[]; // ÃÓ¿¾±¹·®Ó½�§���©~Pc !out vec4 cf; // ͹¼Í­¶�t©~Pc !!void main(void) !{ ! for (int i = 0; i < gl_in.length(); ++i) ! { ! cf = vc[i]; // ͹¼Í­¶�~Pc«t© ! gl_Position = gl_in[i].gl_Position; // ͹¼Í­¶�~P�_«t© ! EmitVertex(); ! } ! EndPrimitive(); !} !�

13

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

in &@, out &@�

14

バーテックスシェーダ ラスタライザ

バーテックスシェーダ ラスタライザ

ジオメトリシェーダ

out in

out inoutin

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

ÆͲÊÒÁ·®Ó½�#version 150 core !#extension GL_ARB_explicit_attrib_location : enable !!in vec4 cf; // ͹¼Í­¶�§���©X[c !!layout (location = 0) out vec4 fc; // ÆͲÊÒÁ�c !!void main(void) !{ ! fc =�cf; !} !

15

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

gl_in.length()�• ÃÓ¿¾±¹·®Ó½�§���©~P08�@

•  ¸°ÊÁη®Ó½���1���@�~P�N�ª©

• ��$G3T GL_GEOMETRY_INPUT_TYPE •  GL_POINTS

•  gl_in.length() = 1 •  GL_LINES

•  gl_in.length() = 2 •  GL_LINES_ADJACENCY

•  gl_in.length() = 4 •  GL_TRIANGLES

•  gl_in.length() = 3 •  GL_TRIANGLES_ADJACENCY

•  gl_in.length() = 6

16

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

EmitVertex()�• ͹¼Í­¶�t©~P08«V:�©

•  gl_Position �¦¡ out &@�]

• �� GL_GEOMETRY_OUTPUT_TYPE •  GL_POINTS

•  EmitVertex() «/���¤1",d •  GL_LINE_STRIP

•  EmitVertex() «/���¤2",d •  GL_TRIANGLE_STRIP

•  EmitVertex() «/���¤3",d

• EmitVertex() «,d���ª #3�V:ÔeYÕ�ª��

17

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

EndPrimitive()�EndPrimitive() «,d���%�� EndPrimitive() «,d��%��

18

EmitVertex()

EmitVertex()

EmitVertex()

EmitVertex()

EmitVertex()

EmitVertex()

EmitVertex()EmitVertex()

EmitVertex()

EmitVertex()

EmitVertex()

EmitVertex()

EmitVertex()

EmitVertex()

EndPrimitive()GL_LINE_STRIP ¥ GL_TRIANGLE_STRIP «g@���©���

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

.��

• I�ÇѲÍÉ�GL_POINTS �¦¨P«>X�¢�× •  https://github.com/tokoik/ggsample14

• ���Ö¸°ÊÁη®Ó½�sphere.geom �¦��Ö�������P��i3�_�?��eY�ª¢�×

•  point.geom «D�?��Ö���i3«�}��_�?������× •  A601/A803 O`-� PC �¸°ÊÁη®Ó½�§���a�~P�E)@� 85 �§���×

•  point.geom ��2H&?�{4��Ô¹ÉÓ¹·®ÓÀ¬Ò²Õ«d������×

•  sphere.geom «ÊÓÏ�L�������× •  t¨��[email protected]

¸°ÊÁη®Ó½« ��U«>�������

19

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

�}��

(0, 0, 1)

(0, 0, -1)

(-1, 0, 0)

(0, 1, 0)

(0, -1, 0)

(1, 0, 0)

•  ~P�_�9��×eY�a�µ­º�������×

•  ~P�J^ȱÁÏ�qA!�j+������×

•  GL_TRIANGLE_STRIP «��>� ���7�¢�×�

20