Slajd 1 -
Transkrypt
Slajd 1 -
dr inż. Jacek Dąbrowski, KSG [email protected] world transform – przekształca wierzchołki z lokalnego układu współrzędnych do współrzędnych świata view transform – wierzchołki ze współrzędnych świata przekształcane są do współrzędnych kamery projection transform – wierzchołki ze współrzędnych kamery przekształcane tak aby wprowadzić iluzję głębi clipping and viewport scaling – usuwa niewidoczne wierzchołki (clipping) i przeskalowuje ich współrzędne do współrzędnych ekranowych (viewport) http://www.khronos.org/opengles/2_X/ Czy? Scissor test Alpha test Stencil test Depth Test Kolor? Kolor Tekstury Światła Blending Dla każdego piksela: Scissor test (viewport) Alpha test glAlphaFunc(GLenum func, GLclampf ref); Stencil test glStencilFunc(GLenum func, GLint ref, GLuint mask); glStencilOp(GLenum fail, GLenum zfail, GLenum zpass); Depth Test glDepthFunc(GLenum func); Rozszerzenia OpenGL Kłopotliwe do utrzymania ◦ Dziesiątki rozszerzeń ◦ Setki modeli GPU Ilość różnych funkcji w fixed pipeline i tak stawia wymagania przed procesorami graficznymi, Dostęp do wielu tekstur i tak wymaga szybkiej komunikacji z pamięcią, W pewnym momencie i tak zaczęło się opłacać umieszczać równoległe, coraz bardziej uniwersalne jednostki obliczeniowe, Naturalny krok – dystrybucja kodu maszynowego do zwykłych operacji w sterowniku, a potem ... Własny kod do przetwarzania pozycji wierzchołków, Własny kod do obliczania koloru każdego stawianego piksela, Geometry shader, Hull shader Język „wysokiego” poziomu ◦ DirectX: ◦ OpenGL: HLSL GLSL http://diaryofagraphicsprogrammer.blogspot.com/2009/12/direct3d-11-overview.html To tylko połowa drogi (i to ta mniejsza) Tak naprawdę 4D – z jedynką na końcu Ważne operacje: Iloczyn skalarny „dot product” Dla dwóch wektorów jednostkowych wartość iloczynu skalarnego to cos kąta pomiędzy wektorami, Iloczyn wektorowy „cross product” Zwraca wektor prostopadły glVertex DisplayList Vertex Array VBO Uproszczenie składni w stosunku do C, Kompilacja przez sterownik OpenGL, Praca równoległa, Możliwość łączenia z tradycyjną ścieżką przetwarzania, Macierze modelview, projekcji – nadal są dostępne, To samo z kolorami, współrzędnymi tekstur, parametrami sprzętowych świateł, Wbudowane typy macierzowe/wektorowe bvec3 A three-component Boolean vector. bvec4 A four-component Boolean vector. ivec2 A two-component integer vector. ... vec4 A four-component floating-point vector. mat3 or mat3x3 A 3×3 floating-point matrix. mat4 or mat4x4 A 4×4 floating-point matrix. mat2x3 A 2-column × 3-row floating-point matrix. mat2x4 A 2-column × 4-row floating-point matrix. ... mat4x3 A 4-column × 3-row floating-point matrix. sampler1D A special-purpose constant used by built-in texture functions to reference a specific 1D texture. It can be declared only as a uniform or function argument. sampler2D A constant used for referencing a 2D texture. Wraz z typami macierzowymi i wektorowymi dostępne są operatory do operacji na nich (mnożenie, dodawanie, geometria) Wektory ◦ Długość, mnożenie (dot, cross), normalizacja ◦ Odbijanie, generowanie normalnych, ftransform Dostęp do pól wektora vec2, vec3, vec4 ◦ Pozycje xyzw ◦ Kolor rgba ◦ Koordynaty stpq Macierze ◦ Mnożenie, transpozycja Matematyka ◦ Trygonometria (funkcje, „arcusy”, deg<->rad) ◦ Potęgi, logarytmy, pierwiastki ◦ Obcinanie, clampowanie, reszta z dzielenia rzeczywistego, interpolacja Brak: ◦ ◦ ◦ ◦ char, char*, string #include sizeof() long, double, int8, ... Zamiana typu – przez konstruktory ◦ int x= int(float) ◦ float x= float(int) ◦ int x= int(float) lub lub lub int(bool) float(bool) int(bool) Modyfikatory typów ◦ const ◦ attribute Dla każdego wierzchołka Predefiniowane atrybuty wierchołków, np: vec4 gl_Vertex, vec4 gl_Certex, vec3 gl_Normal, vec4 gl_MultiTexCoordi, . ◦ uniform Dla całego aktualnego shadera Predefiniowane ... Uniform – predefiniowane parametry: ◦ Macierze i macierze pochodne (odwrotne, transponowane, ...) ◦ Parametry przestrzeni (near, far clipping) ◦ Parametry punktów ◦ ... (literatura) Varying ◦ Do komunikacji z VS do FS ◦ Predefiniowane Gl_FrontColor, gl_BackColor, gl_TexCoord[],... Tekstury – już były Punkty: ◦ Tablice – Arrays ◦ VBO – Vertex Buffer Objects Klasa PointSet ◦ Tryby rysowania 1..5 int shader_program; ... GL.UseProgram(shader_program); static public void CreateShaders(string vsFile, string fsFile, out int vertexObject, out int fragmentObject, out int program) { string vs = new StreamReader(vsFile).ReadToEnd(); string fs = new StreamReader(fsFile).ReadToEnd(); int status_code; string info; vertexObject = GL.CreateShader(ShaderType.VertexShader); fragmentObject = \ GL.CreateShader(ShaderType.FragmentShader); ... } ... // Compile vertex shader GL.ShaderSource(vertexObject, vs); GL.CompileShader(vertexObject); GL.GetShaderInfoLog(vertexObject, out info); GL.GetShader(vertexObject, ShaderParameter.CompileStatus, out status_code); if (status_code != 1) throw new ApplicationException(info); // Compile fragment shader GL.ShaderSource(fragmentObject, fs); GL.CompileShader(fragmentObject); GL.GetShaderInfoLog(fragmentObject, out info); GL.GetShader(fragmentObject, ShaderParameter.CompileStatus, out status_code); if (status_code != 1) throw new ApplicationException(info); ... static public void CreateShaders(string vsFile, string fsFile, out int vertexObject, out int fragmentObject, out int program) { ... program = GL.CreateProgram(); GL.AttachShader(program, fragmentObject); GL.AttachShader(program, vertexObject); GL.LinkProgram(program); } void main() { gl_FrontColor = gl_Color; gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }