ゲームグラフィックス特論 第14回
DESCRIPTION
geometry shaderTRANSCRIPT
³ÓɲÍƬ¾±¹Sm�Z14"�¸°ÊÁη®Ó½�
$G#3�\�� �GPU �v�$G#3«V:�©�
2
¸°ÊÁη®Ó½�5��
3
GPU
GPUCPU
バーテックスシェーダ ラスタライザ
CPU
バーテックスシェーダ ラスタライザ
ジオメトリシェーダ
外部バス
外部バス
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
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
¸°ÊÁη®Ó½�������
6
��� �
���� �
GL_LINES GL_LINES_ADJACENCY GL_TRIANGLES
GL_POINTS GL_LINE_STRIP
GL_TRIANGLES_ADJACENCY
GL_TRIANGLE_STRIP
��������
GL_POINTS
>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
=+�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
¸°ÊÁη®Ó½����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
¸°ÊÁη®Ó½� 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
¸°ÊÁη®Ó½� 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; !
ÃÓ¿¾±¹·®Ó½�#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
¸°ÊÁη®Ó½�#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
in &@, out &@�
14
バーテックスシェーダ ラスタライザ
バーテックスシェーダ ラスタライザ
ジオメトリシェーダ
out in
out inoutin
ÆͲÊÒÁ·®Ó½�#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
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
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
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@���©���
.��
• 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
�}��
(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