´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Hardware pro poˇc´ıtaˇcovou grafiku
NPGR019
Novinky v OpenGL 4
Jan Hor´aˇcek
http://cgg.mff.cuni.cz/
MFF UK Praha
2012
Jan Hor´
aˇ
cek
OpenGL 4
1 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Pˇredpoklady
Historie
Modern´ı programov´
an´ı
Obsah
1
´
Uvod
2
Shadery
3
Texturov´an´ı v OpenGL 4.0
4
Geometrick´e objekty v OpenGL
5
Pˇrehled dalˇs´ıch novinek
6
Literatura
Jan Hor´
aˇ
cek
OpenGL 4
2 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Pˇredpoklady
Historie
Modern´ı programov´
an´ı
Pˇredpoklady
um´ıte programovat v OpenGL
alespoˇ
n z´aklady - vykreslen´ı objektu, texturov´an´ı
um´ıte vertex shadery
jak by se napsala fixn´ı pipeline pomoc´ı vertex shaderu
um´ıte fragment shadery
co vˇse zhruba fragment shader zvl´adne
Jan Hor´
aˇ
cek
OpenGL 4
3 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Pˇredpoklady
Historie
Modern´ı programov´
an´ı
Historie OpenGL ve zkratce
OpenGL 1.0 vyd´ano v roce 1994
fixed-function pipeline
tzn. veˇsker´e zpracov´an´ı pevnˇe dan´e implementac´ı
pipeline se vyv´ıjela a z˚
ustala hlavn´ı souˇc´ast´ı OpenGL aˇz do
verze OpenGL 2.0 (2004)
Vertex
data
Vertex
Transform
and Lighting
Primitive
Setup and
Rasterization
Pixel
Data
Fragment
Coloring and
Texturing
Blending
Texture
Store
Jan Hor´
aˇ
cek
OpenGL 4
4 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Pˇredpoklady
Historie
Modern´ı programov´
an´ı
Poˇc´atky programovateln´e pipeline
OpenGL 2.0 ofici´alnˇe pˇridalo programovateln´e shadery
vertex shader nahrazoval fixed-function transformace a svˇetlo
fragment shader mˇenil pˇriˇrazov´an´ı barvy fragmentu
fixed-function pipeline ovˇsem z˚
ustala a byla ofici´alnˇe k dispozici
t´emˇeˇr beze zmˇeny aˇz do OpenGL 3.1 (2009)
Vertex
data
Vertex
Transform
and Lighting
Primitive
Setup and
Rasterization
Pixel
Data
Fragment
Coloring and
Texturing
Blending
Texture
Store
Jan Hor´
aˇ
cek
OpenGL 4
5 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Pˇredpoklady
Historie
Modern´ı programov´
an´ı
Zmˇena principu vylepˇsov´an´ı OpenGL
OpenGL 3.0 zavedl tzn. deprecation model
metoda pro odstraˇ
nov´
an´ı zastaral´ych ˇc´ast´ı OpenGL
zmˇena i v tom, jak se pouˇz´ıvaj´ı OpenGL kontexty
OpenGL context je datov´a struktura v driveru, kter´a ukl´ad´a
stavov´a data (textury, shadery, atd.)
Typ kontextu
Full
Forward Compatible
Popis
obsahuje vˇse (vˇ
cetnˇ
e deprecated)
obsahuje pouze non-deprecated, tzn. je
podobn´
y pˇr´ıˇst´ı verzi OpenGL
typ kontextu se vyb´ır´a pˇri vytv´aˇren´ı
Jan Hor´
aˇ
cek
OpenGL 4
6 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Pˇredpoklady
Historie
Modern´ı programov´
an´ı
Exkluzivnˇe programovateln´e pipeline
OpenGL 3.1 odstranilo fixn´ı pipeline
programy musely pouˇz´ıt shadery
rozˇs´ıˇren´ı GL_ARB_compatibility zpˇr´ıstupˇ
novalo starou
funkcionalitu
skoro vˇsechna data na GPU
veˇsker´a vertex data pos´ıl´ana pˇres buffer objekty
Vertex
data
Vertex
Shader
Primitive
Setup and
Rasterization
Pixel
Data
Fragment
Shader
Blending
Texture
Store
Jan Hor´
aˇ
cek
OpenGL 4
7 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Pˇredpoklady
Historie
Modern´ı programov´
an´ı
V´ıce programovatelnosti
OpenGL 3.2 (2009)pˇridalo novou shader stage - geometry
shader
Vertex
data
Vertex
Shader
Geometry
Shader
Pixel
Data
Primitive
Setup and
Rasterization
Fragment
Shader
Blending
Texture
Store
Jan Hor´
aˇ
cek
OpenGL 4
8 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Pˇredpoklady
Historie
Modern´ı programov´
an´ı
Kontextov´e profily
OpenGL 3.2 tak´e zavedlo tzv. context profiles
profily kontroluj´ı, kter´e funkce OpenGL jsou k dispozici
podobnˇe jako GL_ARB_compatibility, jen l´epe
zakomponovan´e
moment´alnˇe dva typy profil˚
u: core a
Typ kontextu
Profil
core
Full
compatible
core
Forward Compatible
compatible
Jan Hor´
aˇ
cek
OpenGL 4
compatible
Popis
vˇse z aktu´aln´ı verze
vˇse z cel´e historie OpenGL
vˇse non-deprecated
nen´ı podporov´ano
9 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Pˇredpoklady
Historie
Modern´ı programov´
an´ı
Nejnovˇejˇs´ı pipeline
OpenGL 4.0 (bˇrezen 2010) pˇridalo dalˇs´ı nov´e shader stage tesselation control a tesselation evaluation shaders
OpenGL 4.1 (ˇcervenec 2010) nepˇridalo ˇz´adnou novou stage
Vertex
data
Vertex
Shader
Tesselation
Control
Shader
Pixel
Data
Tesselation
Evaluation
Shader
Geometry
Shader
Primitive
Setup and
Rasterization
Fragment
Shader
Texture
Store
Jan Hor´
aˇ
cek
OpenGL 4
10 / 53
Blending
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Pˇredpoklady
Historie
Modern´ı programov´
an´ı
Modern´ı programov´an´ı ve zkratce
1
vytvoˇr shader programy
2
vytvoˇr a naˇcti buffer objekty pro ukl´ad´an´ı dat
3
propoj um´ıstˇen´ı dat s promˇenn´ymi v shaderech
4
vykresli sc´enu
Jan Hor´
aˇ
cek
OpenGL 4
11 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Obsah
1
´
Uvod
2
Shadery
3
Texturov´an´ı v OpenGL 4.0
4
Geometrick´e objekty v OpenGL
5
Pˇrehled dalˇs´ıch novinek
6
Literatura
Jan Hor´
aˇ
cek
OpenGL 4
12 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Shadery v OpenGL 4.0
OpenGL 4.0 aplikace mus´ı pouˇz´ıvat shadery
verze Shader language pro OpenGL 4.0 je 400
#version 400 [core|compatibility]
Typ shaderu
Vstupn´ı data
GL_VERTEX_SHADER
GL_FRAGMENT_SHADER
GL_TESSELATION_CONTROL_SHADER
GL_TESSELATION_EVALUATION_SHADER
jednotliv´
e vertexy
jednotliv´
e fragmenty
vstupn´ı vertexy kaˇzd´
e patch
v´
ystupn´ı vertexy kaˇzd´
e patch;
teselaˇ
cn´ı koordin´
aty
vstupn´ı vertexy primitiv
GL_GEOMETRY_SHADER
Jan Hor´
aˇ
cek
OpenGL 4
13 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Nahr´an´ı shader˚
u do OpenGL
shadery mus´ı b´yt
zkompilovan´e a slinkovan´e
aby vytvoˇrily spustiteln´y
shader program
Vytvoř
program
OpenGL driver poskytuje
kompil´ator a linker
program mus´ı obsahovat
vertex a fragment
shadery
ostatn´ı shadery jsou
voliteln´e
Jan Hor´
aˇ
cek
OpenGL 4
glCreateProgram()
Vytvoř
shader
glCreateShader()
Načti
zdrojový kód
shaderu
glShaderSource()
Zkompiluj
shader
glCompileShader()
Připoj
shader k
programu
glAttachShader()
Linkování
programu
glLinkProgram()
Použij
program
glUseProgram()
14 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Vytvoˇren´ı shader programu
podobn´e kompilov´an´ı C programu
editace, kompilov´an´ı a slinkov´an´ı
prov´ad´ı se n´asleduj´ıc´ı kroky
1
2
3
vytvoˇren´ı a kompilace shader objekt˚
u
pˇripojen´ı shader objekt˚
u k programu
slinkov´an´ı objekt˚
u do spustiteln´eho programu
Jan Hor´
aˇ
cek
OpenGL 4
15 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Kompilov´an´ı shader˚
u - ˇc´ast 1
vytvoˇr a zkompiluj shader
GLuint shader = glCreateShader( shaderType );
const char* str = "void main() {...}";
glShaderSource( shader, 1, &str, NULL );
glCompileShader( shader );
shaderType je jeden z dostupn´ych typ˚
u shaderu
Jan Hor´
aˇ
cek
OpenGL 4
16 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Kompilov´an´ı shader˚
u - ˇc´ast 2
zkontroluj, jestli je kompilace v poˇr´adku
GLint compiled;
glGetShaderiv( shader, GL_COMPILE_STATUS, &compiled );
if( !compiled ) {
GLint len;
glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &len );
std::string msgs( ’ ’, len );
glGetShaderInfoLog( shader, len, &len, &msgs[0]);
std::cerr << msgs << std::endl;
throw shader_compile_error;
}
Jan Hor´
aˇ
cek
OpenGL 4
17 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Linkov´an´ı shader˚
u - ˇc´ast 1
vytvoˇr pr´azdn´y program object
GLuint program = glCreateProgram();
propoj shader objekty s programem
glAttachShader( program, vertexShader );
glAttachShader( program, fragmentShader );
slinkuj program
glLinkProgram( program );
Jan Hor´
aˇ
cek
OpenGL 4
18 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Linkov´an´ı shader˚
u - ˇc´ast 2
zkontroluj, jestli je vˇse v poˇr´adku
GLint linked;
glGetProgramiv( program, GL_LINK_STATUS, &linked );
if( !linked ) {
GLint len;
glGetProgramiv( program, GL_INFO_LOG_LENGTH, &len );
std::string msgs( ’ ’, len );
glGetProgramInfoLog( program, len, &len, &msgs[0]);
std::cerr << msgs << std::endl;
throw shader_link_error;
}
Jan Hor´
aˇ
cek
OpenGL 4
19 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Spojov´an´ı shader˚
u
mus´ıme specifikovat, jak putuj´ı data mezi shader stages v
cel´em shader programu
v angliˇctinˇe oznaˇcov´ano tak´e jako plumbing
uniforms
vstup
Shader
Jan Hor´
aˇ
cek
OpenGL 4
výstup
20 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Z´aklady spojov´an´ı - vstup
tok dat
do shaderov´ych in promˇenn´ych
zpracov´an´ı instrukcemi v shaderu
v´ystup do shaderov´ych out promˇenn´ych
pˇr´ıklad
out vec4 color;
out vec2 texCoord;
→
→
in vec4 color;
in vec2 texCoord;
shadery se odm´ıtnout slinkovat, pokud nen´ı v poˇr´adku
pospojov´an´ı
v´ystupy neodpov´ıdaj´ı vstup˚
um
Jan Hor´
aˇ
cek
OpenGL 4
21 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Vstupy do shader˚
u
Shader
stage
vertex
tesselation
control
tesselation
evaluation
Zdroj dat
kresl´ıc´ı
pˇr´ıkazy
out promˇenn´e
pˇredeˇsl´e stage
out promˇenn´e
pˇredeˇsl´e stage
geometry
out promˇenn´e
pˇredeˇsl´e stage
fragment
rasterizer
Vstupn´ı data
vertexov´e atributy pro jeden vertex
vstupn´ı patch vertex atributy z vertex shaderu
v´ystupn´ı patch vertex atributy z
tesselation control shaderu
vstupn´ı vertexov´e atributy primitiva z vertex/tesselation evaluation
shaderu
varying promˇenn´e pro fragment
Jan Hor´
aˇ
cek
OpenGL 4
22 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Uniform promˇenn´e
uniform promˇenn´e jsou bˇehem vol´an´ı vykreslen´ı konstantn´ı
jejich hodnoty
mohou b´yt zmˇenˇeny pouze mezi vol´an´ım vykreslov´an´ı
jsou stejn´e pro vˇsechny primitiva
deklaruj´ı se pomoc´ı kl´ıˇcov´eho slova uniform
nastaven´ı hodnoty
vol´an´ı funkc´ı: glUniform*(), glUniformMatrix*(),
glProgramUniform*()
uniform buffer object
pˇred pouˇzit´ım se mus´ı zjistit um´ıstˇen´ı
GLuint loc = glGetUniformLocation( program, "name" );
Jan Hor´
aˇ
cek
OpenGL 4
23 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Vestavˇen´e GLSL promˇenn´e
pˇred OpenGL 3.1 - mnoho vestavˇ
en´
ych promˇenn´ych
vˇetˇsinou se odkazovaly na nˇeco ve fixed-function pipeline
skoro vˇsechny odstranˇeny (spolu s ff-pipeline) pomoc´ı
deprecation reˇzimu
nˇekolik nejd˚
uleˇzitˇejˇs´ıch z˚
ustalo
napˇr´ıklad gl_Position
implicitn´ı v´ystup vˇsech shader˚
u zpracov´avaj´ıc´ıch vertexy
m˚
uˇze b´yt ˇc´ast´ı pole - to z´avis´ı na konkr´etn´ı shader stage
Jan Hor´
aˇ
cek
OpenGL 4
24 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Jednoduch´y vertex a fragment shader
Vertex shader
#version 400 core
Fragment shader
layout(location = 0)
in vec4 vPos;
layout(location = 1)
in vec3 vColor;
#version 400 core
in vec3 color;
layout(location = 0)
out vec4 fragColor;
out vec3 color;
uniform mat4 MVP;
void main()
{
color = vColor;
gl_Position = MVP * vPos;
}
Jan Hor´
aˇ
cek
void main()
{
fragColor = color;
}
OpenGL 4
25 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Program Objects - probl´em?
program object m˚
uˇze nyn´ı obsahovat aˇz pˇ
et shader˚
u
ˇcasto bude rozd´ıl mezi dvˇema programy pouze jeden shader
napˇr´ıklad jin´y fragment shader
toto zp˚
usob´ı hodnˇe duplicit shader˚
u v grafick´e pamˇeti
kaˇzd´y program obsahuje kopii identick´
eho shaderu
Jan Hor´
aˇ
cek
OpenGL 4
26 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Oddˇelen´e shader programy a ˇretˇezce
v OpenGL 4.0 je moˇzn´e vytvoˇrit nez´
avisl´
y shader program
pouze s jednou shader stage
je tˇreba takov´y program oznaˇ
cit, ˇze ho chceme m´ıt nez´avisl´y
pˇred zavol´an´ım glLinkProgram()
nastaven´ı parametru
glProgramParameteri( program, GL_PROGRAM_SEPARABLE, GL_TRUE );
pomocn´a funkce glCreateShaderProgram toto dˇel´a
automaticky
takto oddˇelen´e programy se mohou kombinovat v shader
pipeline
Jan Hor´
aˇ
cek
OpenGL 4
27 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Shader pipelines
Shader pipelines jsou kolekce oddˇelen´ych program objekt˚
u
inicializace shader pipeline
1
2
3
vygeneruj shader pipeline objekt
nastav shader pipeline objekt jako aktivn´ı
pˇripoj oddˇelen´e programov´e objekty do pipeline a nastav, kter´e
shader stage maj´ı b´yt pouˇzity
Jan Hor´
aˇ
cek
OpenGL 4
28 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Shader pipelines - pˇr´ıklad vytvoˇren´ı
vytvoˇren´ı pipeline
// nejprve vytvoˇ
r nˇ
ekolik shader objekt˚
u
GLuint vertPgm = glCreateShaderProgramv( GL_VERTEX_SHADER, 1, &src );
GLuint fragPgm1 = glCreateShaderProgramv( GL_FRAGMENT_SHADER, 1, &src );
GLuint fragPgm2 = glCreateShaderProgramv( GL_FRAGMENT_SHADER, 1, &src );
ShaderEntry shaders[] = {
{ GL_VERTEX_SHADER, "shader.vert" },
{ GL_TESS_CONTROL_SHADER, "shader.cont" },
{ GL_TESS_EVALUATION_SHADER, "shader.eval" },
{ GL_NONE, NULL }
};
GLuint multiPgm = LoadShaders ( shaders );
Jan Hor´
aˇ
cek
OpenGL 4
29 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Shader pipelines - pˇr´ıklad vytvoˇren´ı
vytvoˇren´ı pipeline
// alokuj id pro shader pipeline
enum { VF, VTF, NumPipelines };
GLuint pipelines[NumPipelines];
glGenProgramPipelines( NumPipelines, pipelines );
// zaktivuj pipeline a nastav stage z oddˇ
elen´
ych program objekt˚
u
glBindShaderPipeline( pipelines[VF] );
glUseProgramStages( pipelines[VF], GL_VERTEX_SHADER_BIT, vertPgm );
glUseProgramStages( pipelines[VF], GL_FRAGMENT_SHADER_BIT, fragPgm1 );
glBindShaderPipeline( pipelines[VTF] );
glUseProgramStages( pipelines[VTF],
GL_VERTEX_SHADER_BIT|GL_TESS_EVALUATION_SHADER_BIT, multiPgms);
glUseProgramStages( pipelines[VTF], GL_FRAGMENT_SHADER_BIT, fragPgm2 );
Jan Hor´
aˇ
cek
OpenGL 4
30 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Program nebo pipeline - kdo m´a prioritu?
aktivn´ı shadery se daj´ı nastavit dvˇema zp˚
usoby
glUseProgram() pro zapouzdˇren´e programy
glBindProgramPipeline() pro konfigurovateln´e shader
pipeline
plat´ı n´asleduj´ıc´ı pravidla
programy nastaven´e pomoc´ı glUseProgram() maj´ı nejvyˇsˇs´ı
priroitu, i kdyˇz je nastaven´a pipeline
pipeline se pouˇzije v pˇr´ıpadˇe, ˇze nen´ı aktivn´ı ˇz´adn´y program
(glUseProgram() nebyl zavol´an nebo byl vol´an s nulou)
Jan Hor´
aˇ
cek
OpenGL 4
31 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Volby ve shaderech
ˇcasto se dva shadery stejn´eho typu liˇs´ı jen trochu
Fragment shader
vec4 AmbientColor( vec3 n ) {
return Materials.ambient;
}
vec4 DiffuseColor( vec3 n ) {
return Materials.diffuse *
max(dot(normalize(n),
LightVec.xyz), 0.0 );
}
Jan Hor´
aˇ
cek
uniform int mode;
in vec3 n; // lighting normal
out vec4 fragColor;
struct Materials {...};
void main()
{
if( mode == 0 )
fragColor = AmbientColor(n);
else
fragColor = DiffuseColor(n);
}
OpenGL 4
32 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Probl´emy s t´ımto pˇr´ıstupem
branching!!! - st´ale to nen´ı GPU-friendly
extra instrukce, kter´e nedˇelaj´ı uˇziteˇcnou pr´aci
toto vad´ı obzvl´aˇstˇe ve fragment shaderech, kde se kaˇzd´a
instrukce poˇc´ıt´a
Jan Hor´
aˇ
cek
OpenGL 4
33 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
ˇ sen´ı: shader podprogramy
Reˇ
efektivnˇe se to chov´a jako ukazatele na funkci v C
dovoluje optimalizovanˇejˇs´ı shader
odstranˇeny nepotˇrebn´e if-else v´yrazy
dovoluje to driveru optimalizovat spuˇstˇen´ı shaderu
shader subroutines dovoluj´ı aplikaci specifikovat, kter´y
podprogram z dan´e mnoˇziny se m´a spustit v shaderu
Jan Hor´
aˇ
cek
OpenGL 4
34 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Shader podprogramy
Shader
#version 400 core
// deklaruj typ podprogramu
subroutine vec4 LightFunc( vec3 n );
// specifikuj, kter´
e funkce maj´
ı typ dan´
eho podprogramu
subroutine (LightFunc) vec4 AmbientColor( vec3 n ) {...}
subroutine (LightFunc) vec4 DiffuseColor( vec3 n ) {...}
// deklaruj uniform promˇ
ennou pro volbu podprogramu
subroutine uniform LightFunc materialShader;
void main()
{
materialShader( n );
}
Jan Hor´
aˇ
cek
OpenGL 4
35 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Shadery v OpenGL
Spojov´
an´ı shader˚
u
Separate shader pipelines
Shader subroutines
Shader podprogramy
Aplikace
// zjisti indexy podprogram˚
u
GLuint ambient = glGetSubroutineIndex( program,
GL_FRAGMENT_SHADER, "AmbientColor" );
GLuint diffuse = glGetSubroutineIndex( program,
GL_FRAGMENT_SHADER, "DiffuseColor" );
// zjisti um´
ıstˇ
en´
ı uniform promˇ
enn´
e pro volbu podprogramu
GLuint materialShaderLoc =
glGetSubroutineUniform( program, "materialShader");
// nastav shader uniform na pˇ
r´
ısluˇ
sn´
y index podprogramu
GLint numSubroutines;
glGetIntegerv( GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS, &numSubroutines );
GLuint* indices = new GLuint[numSubroutines];
indices[materialShaderLoc] = ambient;
glUniformSubroutinesuiv( GL_FRAGMENT_SHADER, numSubroutines, indices );
Jan Hor´
aˇ
cek
OpenGL 4
36 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Texture gather
Obsah
1
´
Uvod
2
Shadery
3
Texturov´an´ı v OpenGL 4.0
4
Geometrick´e objekty v OpenGL
5
Pˇrehled dalˇs´ıch novinek
6
Literatura
Jan Hor´
aˇ
cek
OpenGL 4
37 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Texture gather
Texture gather
uˇzivatelsky specifikovan´y v´ybˇer texel˚
u od aktu´aln´ı texturov´e
souˇradnice
v podstatˇe se jedn´a o zobecnˇen´y biline´arn´ı filtering
vrac´ı p˚
uvodn´ı hodnoty texel˚
u, m˚
uˇzete prov´est vlastn´ı filtrov´an´ı
GLSL varianty
1
2
3
textureGather
textureGatherOffset
textureGatherOffsets
Jan Hor´
aˇ
cek
OpenGL 4
38 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Texture gather
Texture gather 2
pˇr´ıklad texture gather
vec2 offsets[4];
vec4 texels = textureGatherOffsets( texture,
texCoord, offsets, [comp] );
funkce textureQueryLod vrac´ı parametry mip-mappingu
textureGather* spolu s textureQueryLod umoˇzn
ˇuje v
podstatˇe vlastn´ı (nejen) anisotropn´ı filtrov´an´ı
Jan Hor´
aˇ
cek
OpenGL 4
39 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Reprezentace geometrick´
ych objekt˚
u
Buffery v OpenGL
VAOs
VBOs
Obsah
1
´
Uvod
2
Shadery
3
Texturov´an´ı v OpenGL 4.0
4
Geometrick´e objekty v OpenGL
5
Pˇrehled dalˇs´ıch novinek
6
Literatura
Jan Hor´
aˇ
cek
OpenGL 4
40 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Reprezentace geometrick´
ych objekt˚
u
Buffery v OpenGL
VAOs
VBOs
Reprezentace geometrick´ych objekt˚
u
geometrick´e objekty jsou reprezentov´any vertexy
vertex je sada obecn´ych atribut˚
u
pozice v prostoru
parametry barev
texturov´e koordin´aty
jak´akoliv dalˇs´ı data pˇr´ımo spojen´a s t´ımto konkr´etn´ım bodem v
prostoru
vertexov´a data mus´ı b´yt uloˇzena ve vertex buffer objektu
(VBOs)
VBOs uloˇzeny ve vertex array objektu (VAOs)
Jan Hor´
aˇ
cek
OpenGL 4
41 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Reprezentace geometrick´
ych objekt˚
u
Buffery v OpenGL
VAOs
VBOs
Datov´e objekty v OpenGL
t´emˇeˇr vˇsechna data pos´ılan´a do OpenGL mus´ı b´yt uloˇzena na
stranˇe serveru (GPU)
vˇsechny objekty pouˇz´ıvaj´ı stejn´y postup
1
2
3
4
generuj jm´eno objektu - glGenBuffers()
nastav jm´eno objektu jako aktivn´ı - glBindBuffer()
inicializuj nebo updatuj data objektu - glBufferData()
nastav jm´eno objektu jako aktivn´ı pro pouˇzit´ı jeho dat glBindBuffer()
Jan Hor´
aˇ
cek
OpenGL 4
42 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Reprezentace geometrick´
ych objekt˚
u
Buffery v OpenGL
VAOs
VBOs
Typy datov´ych buffer˚
u v OpenGL
existuje ˇrada typ˚
u bufferov´ych objekt˚
u v OpenGL
Typ bufferu
Popis uloˇ
zen´
ych dat
GL_ARRAY_BUFFER
GL_ELEMENT_ARRAY_BUFFER
GL_DRAW_INDIRECT_BUFFER
vertexov´
e atributy
vertexov´
e indexy
struktury pro indirect rendering
data pro ˇ
cten´ı urˇ
cen´
a pro kop´ırov´
an´ı do
jin´
ych buffer˚
u
zapisovateln´
a data pro kop´ırov´
an´ı z
jin´
ych buffer˚
u
zapisovateln´
a data pro ˇ
cten´ı pixel˚
u
data pro ˇ
cten´ı na inicializaci textur
transformovan´
e vertexov´
e atributy
texturov´
y buffer pro pouˇzit´ı v shaderu
uniform promˇ
enn´
e pro shader
GL_COPY_READ_BUFFER
GL_COPY_WRITE_BUFFER
GL_PIXEL_PACK_BUFFER
GL_PIXEL_UNPACK_BUFFER
GL_TRANSFORM_FEEDBACK_BUFFER
GL_TEXTURE_BUFFER
GL_UNIFORM_BUFFER
Jan Hor´
aˇ
cek
OpenGL 4
43 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Reprezentace geometrick´
ych objekt˚
u
Buffery v OpenGL
VAOs
VBOs
Vertex Array Objects (VAOs)
VAOs souhrnnˇe ukl´adaj´ı data geometrick´eho primitiva
kroky pro pouˇzit´ı VAO
1
2
3
4
generuj jm´eno VAO objektu - glGenVertexArrays()
nastav VAO jako aktivn´ı pro inicializaci glBindVertexArray()
updatuj vˇsechny VBO asociovan´e s t´ımto VAO objektem
nastav VAO jako aktivn´ı pro kreslen´ı
toto umoˇzn
ˇuje nastavit vˇsechny data nutn´e pro vykreslen´ı
objekty pomoc´ı jednoho vol´an´ı fuknce
dˇr´ıve bylo tˇreba mnoha vol´an´ı pro nastaven´ı vˇsech dat jako
aktivn´ı
Jan Hor´
aˇ
cek
OpenGL 4
44 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Reprezentace geometrick´
ych objekt˚
u
Buffery v OpenGL
VAOs
VBOs
VAOs - pˇr´ıklad
pouˇzit´ı Vertex Array Object
enum{ Cube, Teapot, NumVAOs };
GLuint VAO[NumVAOs];
glGenVertexArrays( NumVAOs, VAO );
glBindVertexArray( VAO[Teapot] );
// nastav VBO data asociovan´
a s touto konvic´
ı
...
// vykreslen´
ı
glBindVertexArray( VAO[Teapot] );
Jan Hor´
aˇ
cek
OpenGL 4
45 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Reprezentace geometrick´
ych objekt˚
u
Buffery v OpenGL
VAOs
VBOs
Vertex Buffer Objects (VBOs)
vertexov´a data mus´ı b´yt uloˇzena ve VBO a asociovan´a s VAO
podobn´e jako inicializace VAO
1
2
3
4
generuj jm´eno VBO objektu - glGenBuffers()
nastav VBO jako aktivn´ı glBindBuffer( GL_ARRAY_BUFFER, ... )
nahraj data do VBO glBufferData( GL_ARRAY_BUFFER, ... )
nastav VAO jako aktivn´ı pro vykreslen´ı glBindVertexArray()
Jan Hor´
aˇ
cek
OpenGL 4
46 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Reprezentace geometrick´
ych objekt˚
u
Buffery v OpenGL
VAOs
VBOs
VBOs - pˇr´ıklad
pouˇzit´ı Vertex Buffer Object
GLfloat vertices[][3] = { {0.0, 0.0, 0.0},
{0.0, 0.0, 1.0}, {0.0, 1.0, 0.0}, ... };
glBindVertexArray( VAO[Cube] );
enum{ Array, NumBuffers };
GLuint buffers[NumBuffers];
glGenBuffers( NumBuffers, buffers );
glBindBuffer( GL_ARRAY_BUFFER, buffers[Array] );
glBufferData( GL_ARRAY_BUFFER, sizeof(vertices),
vertices, GL_STATIC_DRAW );
Jan Hor´
aˇ
cek
OpenGL 4
47 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Reprezentace geometrick´
ych objekt˚
u
Buffery v OpenGL
VAOs
VBOs
Ukl´ad´an´ı vertexov´ych atribut˚
u
vertex arrays jsou velmi flexibiln´ı
uloˇzen´ı dat spojitˇe jako pole
GLsizeiptr size = sizeof(v) + sizeof(c) + sizeof(tc);
glBufferData( GL_ARRAY_BUFFER, size, NULL, GL_STATIC_DRAW );
GLsizei offset = 0;
glBufferSubData( GL_ARRAY_BUFFER, offset, sizeof(v), v);
offset += sizeof(v);
glBufferSubData( GL_ARRAY_BUFFER, offset, sizeof(c), c);
offset += sizeof(c);
glBufferSubData( GL_ARRAY_BUFFER, offset, sizeof(tc), tc);
Jan Hor´
aˇ
cek
OpenGL 4
48 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Reprezentace geometrick´
ych objekt˚
u
Buffery v OpenGL
VAOs
VBOs
Ukl´ad´an´ı vertexov´ych atribut˚
u2
uloˇzen´ı dat jako spojit´e pole struktur
struct VertexData {
GLfloat tc[2];
GLubyte c[4];
GLfloat v[3];
};
VertexData verts[];
glBufferData( GL_ARRAY_BUFFER, sizeof(verts),
verts, GL_STATIC_DRAW );
Jan Hor´
aˇ
cek
OpenGL 4
49 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Pˇrehled
double (4.0, 4.1) - v´ypoˇcty s vyuˇzit´ım double pˇresnosti, nen´ı
bˇeˇzn´e mimo specializovan´e v´ypoˇcetn´ı karty, na mnoh´ych
kart´ach pˇrepoˇcet s vyuˇz´ıt´ım single-precision jednotky
GL_ARB_debug_output (4.1) - alternativa ke glGetError
pomoc´ı callback funkc´ı
GL_ARB_get_program_binary (4.1) - moˇznost z´ısk´an´ı
bin´arn´ıho k´odu shaderu, aktu´alnˇe dobr´e pouze pro cachov´an´ı
(nepˇrenositeln´e)
Jan Hor´
aˇ
cek
OpenGL 4
50 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Pˇrehled 2
atomick´y ˇc´ıtaˇc (4.2)
GL_ARB_shader_image_load_store (4.2) - dovoluje
naˇ
c´ıt´
an´ı i ukl´
ad´
an´ı do textury a atomick´e operace na n´ı
Jan Hor´
aˇ
cek
OpenGL 4
51 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Obsah
1
´
Uvod
2
Shadery
3
Texturov´an´ı v OpenGL 4.0
4
Geometrick´e objekty v OpenGL
5
Pˇrehled dalˇs´ıch novinek
6
Literatura
Jan Hor´
aˇ
cek
OpenGL 4
52 / 53
´
Uvod
Shadery
Texturov´
an´ı v OpenGL 4.0
Geometrick´
e objekty v OpenGL
Pˇrehled dalˇs´ıch novinek
Literatura
Literatura
OpenGL Architecture Review Board: OpenGL Programming
Guide: The Official Guide to Learning OpenGL,
Addison-Wesley, nejnovˇejˇs´ı vyd´an´ı (aktu´alnˇe 8. vyd´an´ı pro
OpenGL 4.1)
Randi J. Rost, Bill Licea-Kane: OpenGL Shading Language,
3rd Edition, Addison-Wesley,
The Khronos Group: The OpenGL Graphics System: A
Specification (Core/Compatibility profile),
http://www.opengl.org/registry/
Christophe Riccino: OpenGL reviews,
http://www.g-truc.net/post-opengl-review.html
Wikipedia: http://en.wikipedia.org/wiki/OpenGL
OpenGL tutorials: http://nehe.gamedev.net
Jan Hor´
aˇ
cek
OpenGL 4
53 / 53
Download

PDF prezentace HoHo