OpenGL не отображает простой треугольник - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь использовать OpenGL для создания некоторого софта для рендеринга, я уже использовал OpenGL в прошлом, но я не могу найти, где я ошибаюсь в своем коде. поэтому я реализовал:

это моя функция класса сетки и конструктор init и отображение:

Mesh::Mesh(char* meshSource)
{

//Creation d'un triangle pour quelques debug...
struct Vertex v0;
struct Vertex v1;
struct Vertex v2;
//Position local
v0.coord = vec3(-1.0f,-1.0f,0.0f);
v1.coord = vec3(1.0f,-1.0f,0.0f);
v2.coord = vec3(0.0f,1.0f,0.0f);
//Coouleur des points
v0.color = vec3(1.0,0.0,0.0);
v1.color = vec3(0.0,1.0,0.0);
v2.color = vec3(0.0,0.0,1.0);
//normals des points
v0.normal = vec3(0.0,0.0,-1.0);
v1.normal = vec3(0.0,0.0,-1.0);
v2.normal = vec3(0.0,0.0,-1.0);

Vertices.push_back(v0);
Vertices.push_back(v1);
Vertices.push_back(v2);

//sert a la premiere initialisation...
_ready = false;

}


void Mesh::init(Shader *_shader)
{

  glGenVertexArrays(1,&_vao);
  glGenBuffers(1,&_vbo);
  checkGLError();
  //bind des caracteristiques du mesh...
  glBindVertexArray(_vao);
  glBindBuffer(GL_ARRAY_BUFFER,_vbo);
  checkGLError();
  //On donne nos données au VBO.
  glBufferData(GL_ARRAY_BUFFER, sizeof(vec3) * Vertices.size(), Vertices.data(), GL_STATIC_DRAW);
  checkGLError();

  int vertex_loc = _shader->getAttribLocation("V_position");
  std::cout << "vertex_loc = " << vertex_loc << std::endl;
  if(vertex_loc>=0)
  {
      glEnableVertexAttribArray(vertex_loc);
      glVertexAttribPointer(vertex_loc, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0);
  }

  int color_loc = _shader->getAttribLocation("V_color");
  std::cout << "color_loc = " << color_loc << std::endl;
  if(color_loc>=0)
  {
      glEnableVertexAttribArray(color_loc);
      glVertexAttribPointer(color_loc, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)sizeof(vec3));
  }

  int normal_loc = _shader->getAttribLocation("V_normal");
  std::cout << "normal_loc = " << normal_loc << std::endl;
  if(normal_loc>=0)
  {
      glEnableVertexAttribArray(normal_loc);
      glVertexAttribPointer(normal_loc, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(2*sizeof(vec3)));
  }

  if(vertex_loc>=0)
      glDisableVertexAttribArray(vertex_loc);
  if(color_loc>=0)
      glDisableVertexAttribArray(color_loc);
  if(normal_loc>=0)
      glDisableVertexAttribArray(normal_loc);

      glBindVertexArray(0);

  this->_ready = true;

}


void Mesh::draw(Shader *_shader)
{

    if(!_ready)
    {
      init(_shader);
      std::cout << "Initialisation du mesh terminer" << std::endl;
    }

    glBindVertexArray(_vao);

    glDrawArrays(GL_TRIANGLE_STRIP, 0,3);

    glBindVertexArray(0);
}

И это мой зритель с моим циклом рендеринга ..:

void S2Viewer::runLoop()
{


/* Loop until the user closes the window */
  glClearColor(1.0, 1.0, 1.0, 0.0);
  glEnable (GL_DEPTH_TEST);

    while (!glfwWindowShouldClose(_S2viewer))
    {
      Shaders[0]->use();
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      for (std::vector<Mesh*>::iterator mesh = Meshs.begin(); mesh < Meshs.end(); mesh++)
      {
          (*mesh)->draw(Shaders[0]);
      }
        glfwSwapBuffers(_S2viewer);
        glfwPollEvents();
        Shaders[0]->desactivate();
    }
    glfwTerminate();
}

и мой main.cpp

int main(int argc,char** argv)
{
  std::cout << "Hello fuck**g World" <<std::endl;
  S2Viewer viewer;
  viewer.init();
  //initialisation des shaders et des mesh...
  Mesh mesh = Mesh("mesh");
  Shader shader("/Users/benz/Documents/projPerso/Moteur_S2_Engine/data/shader/simple.vert","/Users/benz/Documents/projPerso/Moteur_S2_Engine/data/shader/simple.frag");

  viewer.addMesh(&mesh);
  viewer.addShader(&shader);

  viewer.runLoop();
}

Вот мой вершинный шейдер:

#version 410 core


layout(location = 0) in vec3 V_position;
layout(location = 1) in vec3 V_color;
layout(location = 2) in vec3 V_normal;


void main()
{
    gl_Position = vec4(V_position, 1.);
}

Вот мой фрагментный шейдер:

#version 410 core


out vec4 out_color;

void main(void) {

    out_color = vec4(1.0,0.0,0.0,1.0);
}

Когда я запускаю свой код, он отлично компилируется, но ничего не отображается .. Проблема не в шейдере, потому что в прошлом я использовал свой класс Shader в предыдущем софте. Плюс glGetError не показывает никаких ошибок, я не понимаю, где моя проблема ..

PS: я на macOS

1 Ответ

0 голосов
/ 12 ноября 2018

Состояние, если включен атрибут вершины, сохраняется в объекте вершинного массива .

В вашем коде атрибуты вершин включены, но вы отключаете их сразу после этого. Наконец, состояние атрибутов вершины, которые хранятся в векторе состояния объекта массива вершин, «отключено».

Пропустить отключение атрибутов вершины

glBindVertexArray(_vao);

....

if(vertex_loc>=0)
{
    glEnableVertexAttribArray(vertex_loc);
    glVertexAttribPointer(vertex_loc, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0);
}

....


if(vertex_loc>=0)
    glDisableVertexAttribArray(vertex_loc); // <---- delete this
....

glBindVertexArray(0);

2-й параметр glBufferData должен быть размером всего буфера в байтах.
Ваш буфер имеет Vertices.size() элементов, а размер каждого элемента равен sizeof(Vertex), поэтому размер буфера в байтах равен sizeof(Vertex) * Vertices.size():

glBufferData(GL_ARRAY_BUFFER, 
   sizeof(Vertex) * Vertices.size(), // <---- sizeof(Vertex) istead of sizeof(vec3)
   Vertices.data(), GL_STATIC_DRAW);
...