Autor Wątek: OpenGL nie rysuje sześcianu na ekranie.  (Przeczytany 1074 razy)

Offline bajos

  • Użytkownik

# Lipiec 03, 2016, 14:03:01
Witajcie,

Próbuje dodać modele do silnika, lecz ich nie wyświetlało to dodałem hardcoded zwykłe cube.
Tutaj są shadery:
https://github.com/patrykbajos/ZinotEngine/blob/master/home/media/shaders/shader.fs.glsl
https://github.com/patrykbajos/ZinotEngine/blob/master/home/media/shaders/shader.vs.glsl

To jest tworzenie sceny i ogólnie ustawienia OpenGL:
https://github.com/patrykbajos/ZinotEngine/blob/master/src/zinot/core/engine/Viewport.cpp
Tworzenie okna. Może być ważne bo może coś źle w kontekscie ustawione jest.
https://github.com/patrykbajos/ZinotEngine/blob/master/src/zinot/core/engine/Window.cpp
Kamera. Jest tam tworzenie macierzy widoku.
https://github.com/patrykbajos/ZinotEngine/blob/master/src/zinot/core/engine/FPSCamera.cpp

Chodzi o to, że jest tylko czarny ekran. Nie mam pojęcia co jest nie tak. Mam tylko OpenGL 3.3. Wydaje mi się, że wszystko jest zrobione co potrzebne do wyświetlenia. Kompilacja shaderów nie zwraca żadnego błędu. Proszę o pomoc.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Avaj

  • Użytkownik

  • +1
# Lipiec 03, 2016, 17:15:04
   gl::BindBuffer(gl::ARRAY_BUFFER, vbo);
   gl::BindBuffer(gl::ELEMENT_ARRAY_BUFFER, vbo); <--- tutaj chyba ebo?

   gl::BufferData(gl::ARRAY_BUFFER, sizeof(GLfloat) * 8 * 3, verts, gl::STATIC_DRAW);
   gl::BufferData(gl::ARRAY_BUFFER, sizeof(GLuint) * 12 * 3, indexes, gl::STATIC_DRAW); <--- tutaj chyba ELEMENT_ARRAY_BUFFER?

edit:

gl::Enable(gl::CULL_FACE);
   gl::FrontFace(gl::CW); <- to jest celowo? domyślnie jest CCW
   gl::CullFace(gl::BACK);

edit2: defaultowy VAO jest deprecated, musisz stworzyć chociaż jedną i zabindować funkcjami glGenVertexArrays i glBindVertexArray
« Ostatnia zmiana: Lipiec 03, 2016, 17:22:38 wysłana przez Avaj »

Offline bajos

  • Użytkownik

# Lipiec 03, 2016, 17:32:29
No ostatnio jak wczytałem model z Assimpa to było chyba gl::CW, a nie gl::CCW. Przynajmniej w tym moim buforze mam w tym kierunku i dla niego powinno być OK.

Edit:
Teraz kod wygląda:
gl::GenBuffers(1, &vbo);
gl::GenBuffers(1, &ebo);

gl::BindBuffer(gl::ARRAY_BUFFER, vbo);
gl::BindBuffer(gl::ELEMENT_ARRAY_BUFFER, ebo);

gl::BufferData(gl::ARRAY_BUFFER, sizeof(GLfloat) * 8 * 3, verts, gl::STATIC_DRAW);
gl::BufferData(gl::ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * 12 * 3, indexes, gl::STATIC_DRAW);

gl::BindBuffer(gl::ARRAY_BUFFER, 0);
gl::BindBuffer(gl::ELEMENT_ARRAY_BUFFER, 0);

auto wndSize = parentWnd->getSFMLWindow()->getSize();
gl::Viewport(0, 0, wndSize.x, wndSize.y);

projectionMatrix = glm::perspective(70.0f,   // FOV
(float) wndSize.x / (float) wndSize.y, // aspect
0.1f, 100.0f); // near, far
GLint projectionMatLoc = gl::GetUniformLocation(program->getProgram(), "projectionMat");
gl::UniformMatrix4fv(projectionMatLoc, 1, gl::FALSE_, glm::value_ptr(projectionMatrix));

// Vao for compatibility
GLuint vao;
gl::GenVertexArrays(1, &vao);
gl::BindVertexArray(vao);

gl::Enable(gl::DEPTH_TEST);
gl::Enable(gl::TEXTURE_2D);

gl::Enable(gl::CULL_FACE);
gl::FrontFace(gl::CW);
gl::CullFace(gl::BACK);

cam.setPosition(glm::vec3(0, 0, 0));
cam.setVectorUp(glm::vec3(0, 1, 0));
Jednakże nadal jest czarny ekran. Czy mam dobre macieże widoku, modelu i projekcji? Czy przekauje je dobrze do shaderów? Czy shadery są napisane tak by wyświetlić po prostu biały kolor.
« Ostatnia zmiana: Lipiec 03, 2016, 17:40:39 wysłana przez bajos »

Offline bajos

  • Użytkownik

# Lipiec 03, 2016, 18:18:36
@Avaj, dzięki za pomoc. ;) Błędy wynikające z kopiowania i też źle miałem obliczanie macieży widoku bo direction jest względem pozycji kamery, a podawałem w world space. Jakoś to działa. Teraz spróbuję to wczytywanie modeli doprowadzić do działania.