Programowanie Procesorów Graficznych Wykład 1 9.10.2012
Prehistoria Zadaniem karty graficznej było sterowanie sygnałem do monitora tak aby wyświetlić obraz zgodnie z zawartościa pamięci. Programiści pracowali na poziomie pojedynczych pixeli.
Czasy nowożytne Współczesne karty graficzne wykonuja żadania narysowania trójkatów. Ponadto sa programowalne.
O czym to będzie Umiejętność wyświetlania modeli 3D w zadanym położeniu i orientacji, z nałożonymi teksturami, oświetlych kilkoma źródłami światła. Sczegóły na http://th.if.uj.edu.pl/ pbialas/opengl/.
Grafika 3D 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 1 z 1 2 3
Rzutowanie równolegle
Rzutowanie równoległe i rasteryzacja W trakcie rzutowania następuje rasteryzacja. Rzutowane wielokaty zostaja zamienione na piksele. Zasłaniane linie sa wykrywane za pomoca bufora głebokości.
Interpolacja atrybutów Do karty przesyłane sa wierzchołki. Każdy wierzchołek ma przypisany zestaw atrybutów. takich jak położenie czy kolor. Podczas rasteryzacji do pikseli przypisywane s a atrybuty interpolowane.
OpenGL OpenGL dokonuje rzutowania równoleglego w tzw. znormalizowanych współrzędnych urzadzenia.
Rzutowanie perspektywiczne w OpenGL To w jaki sposób uzyskujemy perspektywę? Musimy sami przekształcić współrzędne tak aby zmieściły się wewnatrz sześcianu znormalizowanych współrzędnych urzadzenia.
Macierz rzutowania Macierz rzutowanie przekształca frustum ustawione wzdłuż osi OZ w sześcian znormalizowanych współrzednych urzadzenia.
Macierz rzutowania współrzędne przestrzeni obcięcia x c x y c z c = P y z, w c 1 x n y n = P z n x c w c y c w c z c w c 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 Transformacja współrzędnych dokonywana jest w szaderze wierzchołków. #version 330 Vertex Shader 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 #include<glm/gtc/type_ptr.h> CPU 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 #version 330 Fragment Shader out vec4 vfragcolor; in vec4 vvaryingcolor; void main() { vfragcolor =vvaryingcolor; }
Potok przetwarzania grafiki Uniforms Uniforms Vertex Shader #version 330 Fragment Shader #version 330 Attributes Rasteriser Wierzchołki FrameBuffer
Transformacja widoku x x z x z z x z
Transformacja widoku #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; CPU 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 #version 330 Vertex Shader 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 #version 330 Vertex Shader 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),kąt); 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 #version 330 Fragment Shader #version 330 Attributes Rasteriser Wierzchołki FrameBuffer