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).

Podobne dokumenty