1 Rasterizers Voodo o TL NV 1 Rasterization

  • Slides: 81
Download presentation

Поколение 1: Rasterizers Voodo o T&L NV 1 Rasterization Pixel Ops Power. VR PCX

Поколение 1: Rasterizers Voodo o T&L NV 1 Rasterization Pixel Ops Power. VR PCX 2 q Собственные API: GLide, Power. SGL, Redline Прикладная GLide Видеокарта 3 Dfx программа

Поколение 2: эволюция продолжается Voodoo 2 – 180 Мегапикселей/c, 100 Mhz, SLI; Voodoo 3

Поколение 2: эволюция продолжается Voodoo 2 – 180 Мегапикселей/c, 100 Mhz, SLI; Voodoo 3 Riva 128, TNT – 250 Мегапикселей/c, 125 Mhz; TNT 2 G 20 0 G 40 0 Permedi a 2 Permedia 3 Savage 3 D ATI Rage 128 Прикладная Open. GL программа Direct 3 D i 740 Драйвер Видеокарта

Поколение 3: Geometric Force 300 Mpixels/s, 12 Mtriangles/s, 166 Mhz core 480 Mpixels/s, 15

Поколение 3: Geometric Force 300 Mpixels/s, 12 Mtriangles/s, 166 Mhz core 480 Mpixels/s, 15 Mtriangles/s 120 Mhz core, 23 млн. транзисторов T&L Rasterization Pixel Ops

Поколение 4: Шейдеры R 200, R 250 NV 20, NV 2 5 T&L dp

Поколение 4: Шейдеры R 200, R 250 NV 20, NV 2 5 T&L dp 4 mov r 0. x, v 0, r 0. y, v 0, r 0. z, v 0, r 0. w, v 0, o. D 0, c[4] o. Pos, r 0 Rasterization Pixel Ops c[0] c[1] c[2] c[3] ; Output color ; Output vertex ps. 1. 0 // DX 8 Version. tex t 0 // n-map. texm 3 x 3 pad t 1, t 0_bx 2 texm 3 x 3 pad t 2, t 0_bx 2 v 0_bx 2 texm 3 x 3 tex t 3, t 0_bx 2 dp 3_sat r 0, t 3_bx 2,

Что нужно для работы с Open. GL opengl 32. lib glu 32. lib .

Что нужно для работы с Open. GL opengl 32. lib glu 32. lib . cpp gl. h glu. h opengl 32. dll glu 32. dll . exe C++ glut. h glut 32. lib glut 32. dll

Где взять GLut? • http: //www. opengl. org/developers/ documentation/glut/index. html • http: //www. xmission.

Где взять GLut? • http: //www. opengl. org/developers/ documentation/glut/index. html • http: //www. xmission. com/~nate/glut/glut-3. 7. 6 -bin. zip • http: //www. xmission. com/~nate/glut-3. 7. 6 -src. zip Где прочитать про GLut? • http: //k 2. stcnet. ru/manuals/oglfaq/ - Open. GL FAQ (eng) • http: //www. opengl. org. ru/coding/glut/ - работа с GLut

Самая простая программа #include<gl/glut. h> №include<gl/gl. h> void reshape(int w, int h) { /*

Самая простая программа #include<gl/glut. h> №include<gl/gl. h> void reshape(int w, int h) { /* Здесь обрабатываем изменение размеров окна */ } void display(void) { /* Здесь помещаются команды рисования */ } void idle(void) { /* Здесь происходит анимация */ } int main(int argc, char **argv) { glut. Init(&argc, argv); glut. Init. Display. Mode(GLUT_RGB); // GLUT_DOUBLE|GLUT_DEPTH|GLUT_STENCIL|GLUT_ACCUM glut. Create. Window(“Самая простая программа”); glut. Display. Func(display); glut. Reshape. Func(reshape); glut. Idle. Func(idle); glut. Main. Loop(); return 0; }

Работа с буфером кадра q Задание цвета для заполнения буфера кадра void gl. Clear.

Работа с буфером кадра q Задание цвета для заполнения буфера кадра void gl. Clear. Color(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); q Заполнение экранных буферов void gl. Clear(GLenum buffers); buffers = GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT| GL_ACCUM_BUFFER_BIT| GL_STENCIL_BUFFER_BIT

Преобразование координат: viewport void gl. Viewport(GLint x, GLint y, GLsizei w, GLsizei h); h

Преобразование координат: viewport void gl. Viewport(GLint x, GLint y, GLsizei w, GLsizei h); h w void gl. Depth. Range(GLclampd n, GLclampd f);

Модель begin/end void gl. Matrix. Mode(…); void gl. Load. Identity(); void gl. Mult. Matrixd(…);

Модель begin/end void gl. Matrix. Mode(…); void gl. Load. Identity(); void gl. Mult. Matrixd(…); void void gl. Begin(GLenum type); gl. Vertex(…); gl. Normal(…); gl. Color(…); gl. End(); T&L Rasterization Pixel Ops void gl. Depth. Func(…); void gl. Blend. Func(…); void gl. Stencil. Op(…); void gl. Texture 2 d(…); void gl. Tex. Env(…); void gl. Polygon. Mode(…);

Формирование граней из вершин q GL_TRIANGLES: 3 2 q GL_QUAD 1 S: 3 5

Формирование граней из вершин q GL_TRIANGLES: 3 2 q GL_QUAD 1 S: 3 5 4 0 7 5 1 q GL_POLYG 2 ON: 3 0 1 0 4 7 6 5 2 4 6

Уменьшение количества вершин q GL_TRIANGLE_FAN: 3 n vs. 1+n, 3 n>1 2 q GL_TRIANGLE_STRIP:

Уменьшение количества вершин q GL_TRIANGLE_FAN: 3 n vs. 1+n, 3 n>1 2 q GL_TRIANGLE_STRIP: 3 n vs 4 3 2+n 0 5 7 0 5 1 q GL_QUAD_STRIP: 4 n vs. 2 2+2 n 0 4 1 3 5 6 7 1 2 4 6

Матрицы преобразований void gl. Matrix. Mode(Glenum mode); mode={GL_MODELVIEW|GL_PROJECTION} void gl. Load. Identity(); void gl.

Матрицы преобразований void gl. Matrix. Mode(Glenum mode); mode={GL_MODELVIEW|GL_PROJECTION} void gl. Load. Identity(); void gl. Mult. Matrixd(GLdouble c[16]);

Матрицы преобразований. Продолжение void gl. Translated(GLdouble x, GLdouble y, GLdouble z); void gl. Scaled(GLdouble

Матрицы преобразований. Продолжение void gl. Translated(GLdouble x, GLdouble y, GLdouble z); void gl. Scaled(GLdouble x, GLdouble y, GLdouble z); void gl. Rotated(GLdouble angle, ax, ay, az); void glu. Perspective(GLdouble fov, aspect, znear, zfar);

Как работает glu. Perspective? void glu. Perspective(GLdouble fov, aspect, znear, zfar); Y C 1

Как работает glu. Perspective? void glu. Perspective(GLdouble fov, aspect, znear, zfar); Y C 1 D 2 C 2 O 2 D 1 B 2 B 1 0 Z X O 1 A 2 A 1 fov = D 1 OA 1 (в градусах) aspect = C 1 D 1/D 1 A 1 znear = |OO 1| zfar = |OO 2|

glu. Perspective: продолжение

glu. Perspective: продолжение

Лицевые и нелицевые грани A 2 e 1 y x A 1 e 2

Лицевые и нелицевые грани A 2 e 1 y x A 1 e 2 z A 3 e 2 A 1 e 1 A 2 gl. Enable(GL_CULL_FACE); gl. Disable(GL_CULL_FACE); void gl. Front. Face(GLenum type); type = {GL_CW|GL_CCW} void gl. Cull. Face(GLenum type); type = {GL_FRONT|GL_BACK (по умолчанию)}

Рисуем тор y x z Qi+1, j+1 Y 0 Z Q X f j

Рисуем тор y x z Qi+1, j+1 Y 0 Z Q X f j P Qi, j+1 Qi+1, j Qi, j

Установка параметров освещения в Open. GL q Задаем параметры материала: void gl. Materialfv(GLenum face,

Установка параметров освещения в Open. GL q Задаем параметры материала: void gl. Materialfv(GLenum face, GLеnum param, GLfloat *value); face = {GL_FRONT|GL_BACK} param = {GL_AMBIENT|GL_DIFFUSE|GL_EMISSIVE|GL_SPECULAR} value = float[4] // RGBA void gl. Materialf(GLenum face, GL_SHININESS, GLfloat value); q Задаем цвет фонового освещения: void gl. Light. Modelfv(GLеnum param, GLfloat *value); param = LIGHT_MODEL_AMBIENT value = float[4] // RGBA q Задаем цвет источника освещения: void gl. Lightfv(GLenum light, GLеnum param, GLfloat *value); face = {GL_LIGHT 0|GL_LIGHT 1|…} param = {GL_AMBIENT|GL_DIFFUSE|GL_SPECULAR} value = float[4] // RGBA

Текстурирование в Open. GL: часть 2 q Загружаем текстуру gl. Pixel. Storei(GL_UNPACK_ALIGNMENT, 1); gl.

Текстурирование в Open. GL: часть 2 q Загружаем текстуру gl. Pixel. Storei(GL_UNPACK_ALIGNMENT, 1); gl. Tex. Image 2 D(GL_TEXTURE_2 D, 0, // Mip-level GL_RGB, // Формат текстуры tex_width, tex_height, 0, // Ширина границы GL_RGB, // Формат исходных данных GL_UNSIGNED_BYTE, // Тип данных tex_bits); // Исходные данные q Устанавливаем режимы текстурирования gl. Tex. Parameteri(GL_TEXTURE_2 D, GL_TEXTURE_WRAP_S, GL_REPEAT); gl. Tex. Parameteri(GL_TEXTURE_2 D, GL_TEXTURE_WRAP_T, GL_REPEAT); gl. Tex. Parameteri(GL_TEXTURE_2 D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); gl. Tex. Parameteri(GL_TEXTURE_2 D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

Фильтрация текстур: mipmapping. Часть 2 256 x 256, l=0 64 x 64, l=2 q

Фильтрация текстур: mipmapping. Часть 2 256 x 256, l=0 64 x 64, l=2 q Трилинейная фильтрация GL_LINEAR_MIPMAP_LINEAR 16 x 16, l=4

Использование текстуры как фонового изображения q Устанавливаем ортогональную проекцию gl. Matrix. Mode(GL_PROJECTION); gl. Load.

Использование текстуры как фонового изображения q Устанавливаем ортогональную проекцию gl. Matrix. Mode(GL_PROJECTION); gl. Load. Indentity(); gl. Ortho(-1, 1, -1, 1); q Устанавливаем ортогональную проекцию gl. Matrix. Mode(GL_MODELVIEW); gl. Load. Indentity(); q Рисуем прямоугольник gl. Enable(GL_TEXTURE_2 D); gl. Bind. Texture(bktex); gl. Begin(GL_QUADS); gl. Tex. Coord 2 f(0, 0); gl. Vertex 2 f(-1, -1); gl. Tex. Coord 2 f(1, 0); gl. Vertex 2 f(1, -1); gl. Tex. Coord 2 f(1, 1); gl. Vertex 2 f(1, 1); gl. Tex. Coord 2 f(0, 1); gl. Vertex 2 f(-1, 1); gl. End();

Пиксельные операции. Продолжение. Blending Frame buffer: RGBAij Scissor test Alpha test Depth test Stencil

Пиксельные операции. Продолжение. Blending Frame buffer: RGBAij Scissor test Alpha test Depth test Stencil test Z Buffer: Zij Stencil Buffer: Sij

Scissor & Alpha test Не т Не записывать пиксел gl. Scissor(x, y, w, h);

Scissor & Alpha test Не т Не записывать пиксел gl. Scissor(x, y, w, h); Да gl. Enable(GL_SCISSOR_TEST); gl. Disable(GL_SCISSOR_TEST); Не т Не записывать пиксел gl. Enable(GL_SCISSOR_TEST); Да gl. Disable(GL_SCISSOR_TEST); gl. Alpha. Func(GL_GREATER, 0. 5);

Смешение цветов q Команды Open. GL: gl. Enable(GL_ENABLE); gl. Disable(GL_DISABLE); gl. Blend. Func(sfactor, dfactor)

Смешение цветов q Команды Open. GL: gl. Enable(GL_ENABLE); gl. Disable(GL_DISABLE); gl. Blend. Func(sfactor, dfactor) q gl. Blend. Func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC _ALPHA): q gl. Blend. Func(GL_ONE_MINUS_SRC_ALPHA, GL_SRC _ALPHA): q gl. Blend. Func(GL_ZERO, GL_SRC_COLOR):

Расширения Open. GL q Читаем спецификацию расширения (ARB_multitexture) q Определяем константы … #define …

Расширения Open. GL q Читаем спецификацию расширения (ARB_multitexture) q Определяем константы … #define … GL_TEXTURE 0_ARB GL_TEXTURE 1_ARB GL_TEXTURE 2_ARB GL_TEXTURE 3_ARB 0 x 84 C 0 0 x 84 C 1 0 x 84 C 2 0 x 84 C 3 q Определяем указатели на функции … void (APIENTRY * gl. Multi. Tex. Coord 2 d(GLenum target, GLdouble s, GLdouble t); void (APIENTRY * gl. Active. Texture)(GLenum target); …

Расширения Open. GL. Часть 3. q Получаем указатели на функции … gl. Active. Texture

Расширения Open. GL. Часть 3. q Получаем указатели на функции … gl. Active. Texture = wgl. Get. Proc. Address("gl. Active. Texture. ARB"); gl. Multi. Tex. Coord 2 d = wgl. Get. Proc. Address("gl. Multi. Tex. Coord 2 d. ARB"); … q. Задаем текстурные объекты для каждого текстурного блока … (*gl. Active. Texture)(GL_TEXTURE 0_ARB); gl. Enable(GL_TEXTURE_2 D); gl. Bind. Texture(…); … (*gl. Active. Texture)(GL_TEXTURE 1_ARB); gl. Enable(GL_TEXTURE_2 D); gl. Bind. Texture(…); …

Буфер трафарета и буфер глубины func: fail. Op: Не записывать Не Изменение Sx, y

Буфер трафарета и буфер глубины func: fail. Op: Не записывать Не Изменение Sx, y пиксел т Да zpass. Op: Да zfail. Op: Не Не Изменение Sx, y записывать т пиксел void gl. Stencil. Op(GLenum fail. Op, GLenum zfail. Op, Изменение Sx, y GLenum zpass. Op); void gl. Stencil. Func(GLenum func, GLint ref, GLuint mask); RGBAx, y=F(RGBAx, y, RGBAf)

Теневые объемы. Продолжение. q Рисуем нелицевые грани теневого объема Y … gl. Enable(GL_STENCIL_TEST); gl.

Теневые объемы. Продолжение. q Рисуем нелицевые грани теневого объема Y … gl. Enable(GL_STENCIL_TEST); gl. Stencil. Func(GL_ALWAYS, 1, 1); gl. Stencil. Op(GL_KEEP, GL_REPLACE); gl. Color. Mask(0, 0, 0, 0); gl. Depth. Mask(0); gl. Enable(GL_CULL_FACE); gl. Cull. Face(GL_BACK); gl. Call. List(shadow); … Z

Теневые объемы. Часть 3. q Рисуем лицевые грани теневого объема Y … gl. Stencil.

Теневые объемы. Часть 3. q Рисуем лицевые грани теневого объема Y … gl. Stencil. Func(GL_ALWAYS, 1, 1); gl. Stencil. Op(GL_KEEP, GL_INVERT); gl. Enable(GL_CULL_FACE); gl. Cull. Face(GL_FRONT); gl. Call. List(shadow); gl. Color. Mask(1, 1, 1, 1); gl. Depth. Mask(1); … Z

Теневые объемы. Часть 4. q Возможен вывод граней теневого объема в произвольном порядке. Y

Теневые объемы. Часть 4. q Возможен вывод граней теневого объема в произвольном порядке. Y … gl. Stencil. Func(GL_ALWAYS, 1, 1); gl. Stencil. Op(GL_KEEP, GL_INVERT); gl. Disable(GL_CULL_FACE); gl. Color. Mask(0, 0, 0, 0); gl. Depth. Mask(0); gl. Call. List(shadow); gl. Color. Mask(1, 1, 1, 1); gl. Depth. Mask(1); … Z

Теневые объемы. Часть 5. q Рисуем затененную часть объекта Y … gl. Stencil. Func(GL_EQUAL,

Теневые объемы. Часть 5. q Рисуем затененную часть объекта Y … gl. Stencil. Func(GL_EQUAL, 1, 1); gl. Stencil. Op(GL_KEEP, GL_KEEP); … gl. Call. List(object); … gl. Disable(GL_STENCIL_TEST); …… Z

cg@cs. msu. su

cg@cs. msu. su