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