Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Számítógépes Grafika gyakorlatok Programtervező Informatikus (Nappali) A, C, T szakirányok OpenGL 2. gyakorlat Hapák József.

Hasonló előadás


Az előadások a következő témára: "Számítógépes Grafika gyakorlatok Programtervező Informatikus (Nappali) A, C, T szakirányok OpenGL 2. gyakorlat Hapák József."— Előadás másolata:

1 Számítógépes Grafika gyakorlatok Programtervező Informatikus (Nappali) A, C, T szakirányok OpenGL 2. gyakorlat Hapák József

2 Emlékeztető ● Múlt órán a Windows-os alkalmazásokat tekintettük át ● Továbbá láttuk, hogy programjainak szüksége van ● Egy ablakra, amibe rajzolhatunk ● Egy ún. OpenGL context-re, amin keresztül rajzolunk az ablakra ● Illetve a kettő összekapcsolására, amit a WinAPI segítségével végeztünk (más-más ablakozórendszereknél más-más API/függvényeken-n keresztül történik ez)

3 Most következik ● Mi a grafikus szerelőszalag/grafikus csővezeték/pipeline ● Geometria tárolása és kirajzolása ● Shaderek használata

4 Grafikus szerelőszalag

5 ● Az alkalmazásaink célja a színterünk kirajzolása ● A kép előállítása során használt műveletek sorozatát hívjuk grafikus szerelőszalagnak (grafikus csővezeték, graphics pipeline) ● A színterünket benépesítő geometriai elemeket (ember, hajó stb.) egyszerű, elemi geometriai primitívekből építjük fel ● Részletesebben l. előadás

6 Grafikus szerelőszalag (OGL 2.x) Vertex shader Fragment shader

7 OpenGL 4.x pipeline (x<3)

8 Grafikus primitívek

9 Grafikus primitívek - DEPRECATED

10 Vertex és pixel shader

11 Vertex shader  A vertex shader programunkban végezzük el a bejövő geometria csúcspontjainak transzformációját  glDrawArrays/glDrawElements hívásban hivatkozott csúcspontok lesznek a bemenetei  A vertex shader bemeneti változóihoz ( in módosító) a hozzárendelést a programból csináljuk  A csúcspontbeli attribútumoknál ritkábban változó bemenetet uniform változókon keresztül adhatjuk át (uniform = a kirajzolás hívás idejére konstans)

12 Vertex shader  A bejövő csúcspont koordinátáit clip space-be ( -1 <= x,y,z <= 1) kell transzformálni és a beépített gl_Position változónak átadni – ezt a pipeline nem programozható részeinek is kell  gl_Position = gl_MVPMatrix *bejövő_vertex_pos4  Ezen kívül azt csinálunk „amit akarunk” (minden out -tal megjelölt változónak adhatunk értéket és továbbküldhetjük a következő programozható fázisnak)

13 Vertex shader  A következő beépített kimeneti változók írhatóak a vertex shaderből:  vec4 gl_Position : a transzformált homogén koordinátái a bejövő vertex-nek. Ebbe írnia kell a VS-nek.  float gl_PointSize : a kirajzolandó pont mérete pixelben (point sprite-okhoz). Opcionális.  vec4 gl_ClipVertex : felhasználói vágósíkokhoz. Opcionális.  És ezeken kívül minden, amit mi is felveszünk...

14 Fragment shader  vec4 gl_FragColor : a fragment színe, de ha nem írun bele viszont van kimeneti vec4, az lesz ez  vec4 glFragData[gl_MaxDrawBuffers] : ha több color attachment-je van az aktív FBO-nak, akkor ezen keresztül írhatunk rájuk  float gl_FragDepth : fragment mélységi értéke (ha módosítanánk, mint a raycasterben)  vec4 gl_FragCoord : csak olvasható, a fragment homogén koordinátái (4. koord 1/w)  bool gl_FrontFacing : előrefelé néz-e a fragment lapja

15 Vertex shader #version 400 in vec3 VertexPosition; in vec3 VertexColor; out vec3 Color; void main() { Color = VertexColor; gl_Position = vec4(VertexPosition,1.0); }

16 Fragment shader #version 400 in vec3 Color; out vec4 FragColor; void main() { FragColor = vec4(Color, 1.0); }

17 Program-shader megfeleltetések  Vertex attribútumok és a shader bemeneti változóinak összerendelés: glBindAttribLocation( programHandle, // shader prog 0, // index "VertexPosition"); // sh-s nev glBindAttribLocation( programHandle, 1, "VertexColor");

18 Program-shader megfeleltetések glGenVertexArrays( 1, &vaoHandle ); glBindVertexArray(vaoHandle); glEnableVertexAttribArray(0); // Vertex position glEnableVertexAttribArray(1); // Vertex color glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle); glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte *)NULL ); glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle); glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte *)NULL );

19 Program-shader megfeleltetések  Lényegében tehát általános, indexekkel azonosított csatornákon keresztül megy az információátadás  A csatornák száma a GL_MAX_VERTEX_ATTRIBS segítségével kérhetőek le

20 Layout  A shader oldalon is megcsinálhatjuk a bejövő csatornák „index-esítését”, és nem kell bind-olni az attrib location-öket: layout (location = 0) in vec3 VertexPosition; layout (location = 1) in vec3 VertexColor;  Ezt a kimeneti változóknál is lehet használni: layout (location = 0) out vec4 FragColor;

21 Uniform változók  A shaderen belül read-only-k (konstansok), de kezdeti értéket kaphatnak  uniform mat4 MVP  Típusok:, n = 2,3,4  mat : n x n-es mátrix  vec : n dim vektor

22 Uniform változók  Először meg kell tudnunk az OpenGL-es azonosítóját a uniform változónak:  GLuint mvpInShader = glGetUniformLocation( programHandle, "MVP");  Ezután már típusának megfelelő fv-vel értéket adhatunk neki:  GlUniformMatrix4fv( mvpInShader, 1, GL_FALSE, &app_mvp[0][0]);  Többiek: rm.xml rm.xml

23 Uniform változók  Alaptípusok tömbjét is megjelölhetünk uniform- ként  Ekkor pl. egy mátrixtömb konkrét indexen lévő mátrixának azonosítóját megkapjuk így:  GLuint location = glGetUniformLocation( programHandle, "MyArray[1]" );

24 Uniform block  Több shader változó használhatja a program szempontjából ugyanazon uniform változókat  Ezeket mégis külön-külön kellene feltöltenünk stb., mert ugyanannak a uniform változónak más lesz a címe a különböző shader programokban  A uniform block segítségével ezen segíthetünk (csak használjunk shared layout-ot)

25 Uniform block – a shaderben uniform BlobSettings { vec4 InnerColor; vec4 OuterColor; float RadiusInner; float RadiusOuter; };

26 Uniform block  A uniform változók adatait tartalmazó puffer objektum a uniform buffer object  A változókra hivatkozásnál elég az adattag nevét írni, nem kell prefixelni az UBO nevével (tehát pl. elég az InnerColor, nem kell BlobSettings.InnerColor)

27 Uniform block GLuint blockIndex = glGetUniformBlockIndex( programHandle, "BlobSettings"); GLint blockSize; glGetActiveUniformBlockiv( programHandle, blockIndex, GL_UNIFORM_BLOCK_DATA_SIZE, &blockSize); GLubyte * blockBuffer= (GLubyte *)malloc(blockSize);

28 Uniform block const GLchar *names[] = { "InnerColor", "OuterColor", "RadiusInner", "RadiusOuter" }; GLuint indices[4]; glGetUniformIndices( programHandle, 4, names, indices); GLint offset[4]; glGetActiveUniformsiv( programHandle, 4, indices, GL_UNIFORM_OFFSET, offset);

29 Uniform block GLfloat outerColor[] = {0.0f, 0.0f, 0.0f, 0.0f}; GLfloat innerColor[] = {1.0f, 1.0f, 0.75f, 1.0f}; GLfloat innerRadius = 0.25f, outerRadius = 0.45f; memcpy(blockBuffer + offset[0], innerColor, 4 * sizeof(GLfloat)); memcpy(blockBuffer + offset[1], outerColor, 4 * sizeof(GLfloat)); memcpy(blockBuffer + offset[2], &innerRadius, sizeof(GLfloat)); memcpy(blockBuffer + offset[3], &outerRadius, sizeof(GLfloat));

30 Uniform block GLuint uboHandle; glGenBuffers( 1, &uboHandle ); glBindBuffer( GL_UNIFORM_BUFFER, uboHandle ); glBufferData( GL_UNIFORM_BUFFER, blockSize, blockBuffer, GL_DYNAMIC_DRAW ); glBindBufferBase( GL_UNIFORM_BUFFER, blockIndex, uboHandle );

31 Fragment shader #version 400 in vec3 Color; out vec4 FragColor; void main() { FragColor = vec4(Color, 1.0); }

32


Letölteni ppt "Számítógépes Grafika gyakorlatok Programtervező Informatikus (Nappali) A, C, T szakirányok OpenGL 2. gyakorlat Hapák József."

Hasonló előadás


Google Hirdetések