Wykład 1
Transkrypt
Wykład 1
Programowanie Procesorów Graficznych Wykład 1 9.10.2012 Prehistoria I Zadaniem karty graficznej było sterowanie sygnałem do monitora tak aby wyświetlić obraz zgodnie z zawartościa˛ pamieci. ˛ I Programiści pracowali na poziomie pojedynczych pixeli. Czasy nowożytne I Współczesne karty graficzne wykonuja˛ żadania ˛ narysowania trójkatów. ˛ I Ponadto sa˛ programowalne. O czym to bedzie ˛ I Umiejetność ˛ wyświetlania modeli 3D w zadanym położeniu i orientacji, z nałożonymi teksturami, oświetlych kilkoma źródłami światła. I Sczegóły na http://th.if.uj.edu.pl/∼pbialas/OpenGL/. Grafika 3D I Trójwymiarowe obiekty przedstawiamy na płaszczyźnie poprzez rzutowanie. Grafika 3D Rzutowanie perspektywiczne Frustum Rzutowanie perspektywiczne y 3 2 1 -5 -4 -3 -2 z -1 -1 -2 -3 Rzutowanie równolegle Rzutowanie równoległe i rasteryzacja I W trakcie rzutowania nastepuje ˛ rasteryzacja. I Rzutowane wielokaty ˛ zostaja˛ zamienione na piksele. I Zasłaniane linie sa˛ wykrywane za pomoca˛ bufora głebokości. Interpolacja atrybutów I Do karty przesyłane sa˛ wierzchołki. Każdy wierzchołek ma przypisany zestaw atrybutów. takich jak położenie czy kolor. I Podczas rasteryzacji do pikseli przypisywane sa˛ atrybuty interpolowane. OpenGL I OpenGL dokonuje rzutowania równoleglego w tzw. znormalizowanych współrz˛ednych urzadzenia. ˛ Rzutowanie perspektywiczne w OpenGL I To w jaki sposób uzyskujemy perspektywe? ˛ I Musimy sami przekształcić współrz˛edne tak aby zmieściły sie˛ wewnatrz ˛ sześcianu znormalizowanych współrz˛ednych urzadzenia. ˛ Macierz rzutowania I Macierz rzutowanie przekształca frustum ustawione wzdłuż osi OZ w sześcian znormalizowanych współrzednych urzadzenia. ˛ Macierz rzutowania – współrz˛edne przestrzeni obciecia ˛ xc x yc y = P , zc z wc 1 xc xn wc y yn = P wcc zc zn wc CPU #include<glm/glm.hpp> #include<glm/gtc/matrix_transform.hpp> glm::mat4 P1 = glm::frustum(left,right,bottom, top, near, far); glm::mat4 P2 = glm::perspective(fovy,aspect,near,far) Szader wierzchołków I Transformacja współrz˛ednych dokonywana jest w szaderze wierzchołków. Vertex Shader #version 330 in vec4 vVertex; in vec4 vColor; uniform mat4 PMatrix; out vec4 vVaryingColor; void main() { vVaryingColor = vColor; gl_Position = PMatrix*vVertex; } Atrybuty wierzchołków CPU shader = gltLoadShaderPairWithAttributes("shader.vp", "shader.fp", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_COLOR, "vColor"); glBegin(GL_TRIANGLES); glVertexAttrib3f(GLT_ATTRIBUTE_COLOR, 1.0, 0.0, 0.0); glVertex3f(1.0f, 1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f); glVertex3f(0.0f, 0.0f, 2.0f); gleEnd(); Zmienne uniform CPU #include<glm/gtc/type_ptr.h> PMatrixLocation = glGetUniformLocation(shader, "PMatrix"); if (PMatrixLocation == -1) fprintf(stderr, "uniform PMatrix could not be found\n"); glUniformMatrix4fv(PMatrixLocation, 1, GL_FALSE, glm::value_ptr(P1) ); Szader fragmentów Fragment Shader #version 330 out vec4 vFragColor; in vec4 vVaryingColor; void main() { vFragColor =vVaryingColor; } Potok przetwarzania grafiki Uniforms Uniforms Vertex Shader Fragment Shader #version 330 Attributes #version 330 Rasteriser Wierzchołki FrameBuffer Transformacja widoku x x z x z z z x Transformacja widoku CPU #include<glm/glm.hpp> #include<glm/gtc/matrix_transform.hpp> #include<glm/gtc/type_ptr.h> glm::mat4 V = glm::lookAt(eye,center,up); glM::mat4 VP=P*V; VPMatrixLocation = glGetUniformLocation(shader, "VPMatrix"); if (VPMatrixLocation == -1) fprintf(stderr, "uniform VPMatrix could not be found\n"); glUniformMatrix4fv(VPMatrixLocation, 1, GL_FALSE, glm::value_ptr(VP) ); Szader wierzchołków Vertex Shader #version 330 in vec4 vVertex; in vec4 vColor; uniform mat4 VPMatrix; out vec4 vVaryingColor; void main() { vVaryingColor = vColor; gl_Position = VPMatrix*vVertex; } Transformacja Modelu x x z z Transformacja modelu CPU #include<glm/glm.hpp> #include<glm/gtc/matrix_transform.hpp> #include<glm/gtc/type_ptr.h> glm::mat4 T = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f,1.0f,0.0f)); glM::mat4 MVP=P*V*T; VPMatrixLocation = glGetUniformLocation(shader, "MVPMatrix"); if (VPMatrixLocation == -1) fprintf(stderr, "uniform MVPMatrix could not be found\n"); glUniformMatrix4fv(MVPMatrixLocation, 1, GL_FALSE, glm::value_ptr(MVP) ); Szader wierzchołków Vertex Shader #version 330 in vec4 vVertex; in vec4 vColor; uniform mat4 MVPMatrix; out vec4 vVaryingColor; void main() { vVaryingColor = vColor; gl_Position = MVPMatrix*vVertex; } Transformacja Modelu x x z z Transformacja Modelu x x z z x z Transformacja modelu CPU #include<glm/glm.hpp> #include<glm/gtc/matrix_transform.hpp> #include<glm/gtc/type_ptr.h> glm::mat4 T = glm::rotate(glm::mat4(1.0f),kat); ˛ glm::mat4 R = glm::translate(T, glm::vec3(-10.f,-1.0f,0.0f)); glM::mat4 MVP=P*V*R; VPMatrixLocation = glGetUniformLocation(shader, "MVPMatrix"); if (VPMatrixLocation == -1) fprintf(stderr, "uniform MVPMatrix could not be found\n"); glUniformMatrix4fv(MVPMatrixLocation, 1, GL_FALSE, glm::value_ptr(MVP) ); Potok przetwarzania grafiki Uniforms Uniforms Vertex Shader Fragment Shader #version 330 Attributes #version 330 Rasteriser Wierzchołki FrameBuffer