GRK 1
Transkrypt
GRK 1
GRK 1 Dr. Wojciech Palubicki Rendering Graphics Rendering Pipeline OpenGL • Specyfikacja opisująca proces renderingu • Istnieją implementacje w różnych językach programistycznych (np. C, JavaScript, Java, Python, …) • My będziemy używać C++, glew i freeglut OpenGL Extension Wrangler Library (GLEW) • Programistyczna biblioteka międzyplatformowa do języka C/C++, pomagająca w odpytywaniu i ładowaniu rozszerzeń OpenGL freeglut • otwarta implementacja biblioteki GLUT. GLUT (a więc również freeglut) pozwala użytkownikowi tworzyć i zarządzać oknami używającymi OpenGL na wielu platformach Pierwszy OpenGL projekt • Stwórz pusty projekt w Visual Studio i załącz biblioteki glew i freeglut do niego (ścieżkę do katalogów dodaje się: Project properties -> Linker -> General -> Additional Library Dependencies, biblioteki opengl32.lib;freeglut.lib;glew32.lib; dodaje się w miejscu: -> Linker-> Input -> Additional…). Pliki biblioteki freeglut 2.8.1 trzeba będzie zbudować we VS i skopiować do samego miejsca w jakim się projekt znajduje (można stworzyć podkatalogi np. Dependencies/freeglut lub /glew). Żeby zainstalować freeglut i glew to należy użyć Tools -> Nuget PM i uruchomić z konsoli instrukcje: Install-Package nupengl.core. Napisz program który otwiera puste okno (kod źródłowy na następnej stronie). #include "Dependencies\glew\glew.h" #include "Dependencies\freeglut\freeglut.h" #include <iostream> int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(500, 500); glutInitWindowSize(800, 600); glutCreateWindow("OpenGL Pierwsze Okno"); glutMainLoop(); return 0; } Pusta Scena • Napisz funkcje renderScene (dane wejściowe i wyjściowe to void) która zawiera następujący kod: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(/*kolor*/); glutSwapBuffers(); • Dodaj funkcje renderScene do kontekstu OpenGL wywołując funkcje glutDisplayFunc w funkcji main(). Funkcja renderScene stanie się funkcją wyświetlaną w naszym okienku. Sprawdzanie wersji OpenGL • Sprawdź czy wersja OpenGL jest 4.3 (GL_VERSION_4_3) używając funkcji glewIsSupported. Shader • krótki program komputerowy, często napisany w specjalnym języku (shader language), który w grafice trójwymiarowej opisuje właściwości pikseli oraz wierzchołków. Vertex Shader • Zadaniem vertex shadera jest transformacja położenia wierzchołka w wirtualnej przestrzeni 3D na współrzędne 2D na ekranie Fragment Shader • Zadaniem fragment shadera jest wyliczanie koloru pikseli. Pierwszy Trójkąt • Dodaj dwa pliki ShaderLoader.cpp i ShaderLoader.h do projektu. Stwórz dwa pliki Vertex_Shader.glsl i Fragment_Shader.glsl w katalogu naszego projektu i załaduj je do kontekstu OpenGL twojej aplikacji (shaderLoader.CreateProgram). using namespace Core; GLuint program; void renderScene(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(0.0, 0.3, 0.3, 1.0); //używaj wprowadzone shadery glUseProgram(program); //narysuj trzy trojkaty glDrawArrays(GL_TRIANGLES, 0, 3); glutSwapBuffers(); } void Init() { glEnable(GL_DEPTH_TEST); //załaduj i skompiluj shadery Core::Shader_Loader shaderLoader; program = shaderLoader.CreateProgram(/*załaduj fragment i vertex shadery*/); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } int main(int argc, char **argv) { glutInit( &argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(100, 100); glutInitWindowSize(800, 600); glutCreateWindow("OpenGL Pierwsze Okno"); glewInit(); Init(); // rejestruj callbacks glutDisplayFunc(renderScene); glutMainLoop(); glDeleteProgram(program); return 0; } Vertex Shader Fragment Shader #version 430 core out vec4 color; void main(void) { color = vec4(/*wybierz kolor*/); } #version 430 core void main(void) { const vec4 vertices[3] = vec4[3](/* zdefinuj trzy wierzchołki typu vec4 pomiędzy [-1, 1] ∈ ℝ4 */); gl_Position = vertices[gl_VertexID]; } Specyfikacja kolorów • Za pomocy funkcji mix zmień kolor trójkąta (w fragment shaderze) wobec wartości współrzędnej y obecnego fragmentu (gl_FragCoord).