1 / 32

Számítógépes Grafika gyakorlatok Programtervező Informatikus (Nappali) A, C, T szakirányok

Számítógépes Grafika gyakorlatok Programtervező Informatikus (Nappali) A, C, T szakirányok. OpenGL 2. gyakorlat Hapák József. 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

saniya
Download Presentation

Számítógépes Grafika gyakorlatok Programtervező Informatikus (Nappali) A, C, T szakirányok

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Számítógépes Grafika gyakorlatokProgramtervező 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. Grafikus szerelőszalag 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 vec4gl_FragColor: a fragment színe, de ha nem írun bele viszont van kimeneti vec4, az lesz ez vec4glFragData[gl_MaxDrawBuffers]: ha több colorattachment-je van az aktív FBO-nak, akkor ezen keresztül írhatunk rájuk floatgl_FragDepth: fragment mélységi értéke (ha módosítanánk, mint a raycasterben) vec4gl_FragCoord: csak olvasható, a fragment homogén koordinátái (4. koord 1/w) boolgl_FrontFacing: előrefelé néz-e a fragment lapja

  15. Vertex shader #version 400 invec3 VertexPosition; invec3 VertexColor; outvec3 Color; void main() { Color = VertexColor; gl_Position = vec4(VertexPosition,1.0); }

  16. Fragment shader #version 400 invec3Color; outvec4FragColor; 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); // Vertexposition glEnableVertexAttribArray(1); // Vertexcolor 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>: n x n-es mátrix vec<n>: 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: http://www.opengl.org/sdk/docs/man/xhtml/glUniform.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 GLuintblockIndex = glGetUniformBlockIndex( programHandle, "BlobSettings"); GLintblockSize; glGetActiveUniformBlockiv( programHandle, blockIndex, GL_UNIFORM_BLOCK_DATA_SIZE, &blockSize); GLubyte * blockBuffer= (GLubyte *)malloc(blockSize);

  28. Uniform block constGLchar *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 GLfloatouterColor[] = {0.0f, 0.0f, 0.0f, 0.0f}; GLfloatinnerColor[] = {1.0f, 1.0f, 0.75f, 1.0f}; GLfloatinnerRadius = 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 GLuintuboHandle; 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 invec3 Color; outvec4 FragColor; void main() { FragColor = vec4(Color, 1.0); }

More Related