OpenGL Draw 2D Triangle Project OO-подход ⇐ C++
-
Гость
OpenGL Draw 2D Triangle Project OO-подход
Привет, недавно я начал изучать Open GL с нуля, используя в качестве руководства ресурс https://learnopengl.com/, который показался мне довольно хорошим для начала.
Первой задачей для меня было нарисовать простой 2D-треугольник внутри окна Open GL. Код, если он также доступен у автора внутри https://github.com/JoeyDeVries/LearnOpe ... iangle.cpp
Моей первой попыткой было изучить этот код и сделать его более объектно-ориентированным, создав несколько классов на основе простого дизайна.
Однако выполненная мной инкапсуляция кода, которая соответствует коду, отвечающему за привязку вершин внутри VERTEX BUFFER OBJECT, кажется неподходящей, поскольку я поместил этот код вне функции-члена моего вершинного шейдера. класс, рисунок правильный. Мне нелегко понять, в чем заключается реальная проблема, поэтому я поделюсь кучей кода, реализованного для этого простого случая.
В моем первоначальном проекте я определил классы, соответствующие фрагментному и вершинному шейдеру. Учитывая это, я подумал, что мог бы иметь частную функцию-член класса VertexShader, которая выполняет привязку вершин, а также эта функция вызывается как часть конструкции. объекта VertexShader Конструктор и эта функция выглядят так:
int VertexShader::sVertexShaderID = 0; //статическая переменная-член VertexShader::VertexShader(const GLenum glEnumTarget, const GLenum glUsage, const float\* вершины) : Shader("#ядро версии 330\\n" "макет (расположение = 0) в vec3 aPos;\\n" "void main()\\n" "{\\n" " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\\n" "}\\0", GL_VERTEX_SHADER), \_glTarget(glEnumTarget), \_glUsage(glUsage) { \_id_vbo = ++sVertexShaderID; пСоздать(); pBindVertices (вершины); } void VertexShader::pBindVertices(const float\* вершины) { // Переменная-член glTarget = GL_ARRAY_BUFFER и \_glUsage = GL_STATIC_DRAW // инициализируется в конструкторе класса VertexShader. // \_id_vbo также инициализируется в конструкторе с использованием значения // статическая переменная sVertexShaderID const без знака int _id_vao = 1; glGenVertexArrays(_id_vao, &_VAO); glGenBuffers(_id_vbo, &_VBO); //// Генерация и связывание VAO glBindVertexArray (_VAO); // Генерация и связывание VBO glBindBuffer (_glTarget, _VBO); glBufferData(_glTarget, sizeof(вершины), вершины, _glUsage); // Количество вершин glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray (0); glBindBuffer (glTarget, 0); glBindVertexArray (0); } // Пример аналогичного кода, который не рисует треугольник интервал основной() { вершины с плавающей точкой\[\] = { \-0.5f, -0.5f, 0.0f, // влево 0\.5f, -0.5f, 0.0f, // вправо 0\.0f, 0.5f, 0.0f // верх }; GLWindow glWindow (WINDOW_WIDTH, WINDOW_HEIGHT); Радинициатор gInit; авто _window = glWindow.GetWindow(); VertexShader vertexShader (GL_ARRAY_BUFFER, GL_STATIC_DRAW, вершины); ФрагментШейдер // ОбъектshaderProgram должен создать программу и присоединить шейдеры, используя их идентификаторы. Программа ShaderProgram(vertexShader.GetID(),fragShader.GetID()); в то время как (!glfwWindowShouldClose(_window)) { если (glfwGetKey(_window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose (_window, true); glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear (GL_COLOR_BUFFER_BIT); программа.Использовать(); glBindVertexArray(vertexShader.VAO()); // получаем VAO из объекта triaShader glDrawArrays (GL_TRIANGLES, 0, 3); glBindVertexArray (0); glfwSwapBuffers (_window); glfwPollEvents(); } } // Пример аналогичного кода, рисующего треугольник интервал основной() { вершины с плавающей точкой\[\] = { \-0.5f, -0.5f, 0.0f, // влево 0\.5f, -0.5f, 0.0f, // вправо 0\.0f, 0.5f, 0.0f // верх }; GLWindow glWindow (WINDOW_WIDTH, WINDOW_HEIGHT); Радинициатор gInit; авто _window = glWindow.GetWindow(); TriaVertexShader triaShader (GL_ARRAY_BUFFER, GL_STATIC_DRAW, вершины); ФрагментШейдер // ОбъектshaderProgram должен создать программу и присоединить шейдеры, используя их идентификаторы. Программа ShaderProgram(triaShader.GetID(),fragShader.GetID()); // Используйте тот же код, который существует внутри VertexShader::pBindVertices // ---------------------------------------------------------------- ----------------- беззнаковый интервал _VAO,_VBO; const без знака int _id_vao = 1; const без знака int _id_vbo = 1; glGenBuffers(_id_vbo, &_VBO); //// Генерация и связывание VAO glGenVertexArrays(_id_vao, &_VAO); glBindVertexArray (_VAO); // Генерация и связывание VBO glBindBuffer (GL_ARRAY_BUFFER, _VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(вершины), вершины, GL_STATIC_DRAW); // Количество вершин glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray (0); glBindBuffer (GL_ARRAY_BUFFER, 0); glBindVertexArray (0); // ---------------------------------------------------------------- ----------------- // Цикл рендеринга в то время как (!glfwWindowShouldClose(_window)) { если (glfwGetKey(_window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose (_window, true); glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear (GL_COLOR_BUFFER_BIT); программа.Использовать(); glBindVertexArray (_VAO); glDrawArrays (GL_TRIANGLES, 0, 3); glBindVertexArray (0); glfwSwapBuffers (_window); glfwPollEvents(); } }
Привет, недавно я начал изучать Open GL с нуля, используя в качестве руководства ресурс https://learnopengl.com/, который показался мне довольно хорошим для начала.
Первой задачей для меня было нарисовать простой 2D-треугольник внутри окна Open GL. Код, если он также доступен у автора внутри https://github.com/JoeyDeVries/LearnOpe ... iangle.cpp
Моей первой попыткой было изучить этот код и сделать его более объектно-ориентированным, создав несколько классов на основе простого дизайна.
Однако выполненная мной инкапсуляция кода, которая соответствует коду, отвечающему за привязку вершин внутри VERTEX BUFFER OBJECT, кажется неподходящей, поскольку я поместил этот код вне функции-члена моего вершинного шейдера. класс, рисунок правильный. Мне нелегко понять, в чем заключается реальная проблема, поэтому я поделюсь кучей кода, реализованного для этого простого случая.
В моем первоначальном проекте я определил классы, соответствующие фрагментному и вершинному шейдеру. Учитывая это, я подумал, что мог бы иметь частную функцию-член класса VertexShader, которая выполняет привязку вершин, а также эта функция вызывается как часть конструкции. объекта VertexShader Конструктор и эта функция выглядят так:
int VertexShader::sVertexShaderID = 0; //статическая переменная-член VertexShader::VertexShader(const GLenum glEnumTarget, const GLenum glUsage, const float\* вершины) : Shader("#ядро версии 330\\n" "макет (расположение = 0) в vec3 aPos;\\n" "void main()\\n" "{\\n" " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\\n" "}\\0", GL_VERTEX_SHADER), \_glTarget(glEnumTarget), \_glUsage(glUsage) { \_id_vbo = ++sVertexShaderID; пСоздать(); pBindVertices (вершины); } void VertexShader::pBindVertices(const float\* вершины) { // Переменная-член glTarget = GL_ARRAY_BUFFER и \_glUsage = GL_STATIC_DRAW // инициализируется в конструкторе класса VertexShader. // \_id_vbo также инициализируется в конструкторе с использованием значения // статическая переменная sVertexShaderID const без знака int _id_vao = 1; glGenVertexArrays(_id_vao, &_VAO); glGenBuffers(_id_vbo, &_VBO); //// Генерация и связывание VAO glBindVertexArray (_VAO); // Генерация и связывание VBO glBindBuffer (_glTarget, _VBO); glBufferData(_glTarget, sizeof(вершины), вершины, _glUsage); // Количество вершин glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray (0); glBindBuffer (glTarget, 0); glBindVertexArray (0); } // Пример аналогичного кода, который не рисует треугольник интервал основной() { вершины с плавающей точкой\[\] = { \-0.5f, -0.5f, 0.0f, // влево 0\.5f, -0.5f, 0.0f, // вправо 0\.0f, 0.5f, 0.0f // верх }; GLWindow glWindow (WINDOW_WIDTH, WINDOW_HEIGHT); Радинициатор gInit; авто _window = glWindow.GetWindow(); VertexShader vertexShader (GL_ARRAY_BUFFER, GL_STATIC_DRAW, вершины); ФрагментШейдер // ОбъектshaderProgram должен создать программу и присоединить шейдеры, используя их идентификаторы. Программа ShaderProgram(vertexShader.GetID(),fragShader.GetID()); в то время как (!glfwWindowShouldClose(_window)) { если (glfwGetKey(_window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose (_window, true); glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear (GL_COLOR_BUFFER_BIT); программа.Использовать(); glBindVertexArray(vertexShader.VAO()); // получаем VAO из объекта triaShader glDrawArrays (GL_TRIANGLES, 0, 3); glBindVertexArray (0); glfwSwapBuffers (_window); glfwPollEvents(); } } // Пример аналогичного кода, рисующего треугольник интервал основной() { вершины с плавающей точкой\[\] = { \-0.5f, -0.5f, 0.0f, // влево 0\.5f, -0.5f, 0.0f, // вправо 0\.0f, 0.5f, 0.0f // верх }; GLWindow glWindow (WINDOW_WIDTH, WINDOW_HEIGHT); Радинициатор gInit; авто _window = glWindow.GetWindow(); TriaVertexShader triaShader (GL_ARRAY_BUFFER, GL_STATIC_DRAW, вершины); ФрагментШейдер // ОбъектshaderProgram должен создать программу и присоединить шейдеры, используя их идентификаторы. Программа ShaderProgram(triaShader.GetID(),fragShader.GetID()); // Используйте тот же код, который существует внутри VertexShader::pBindVertices // ---------------------------------------------------------------- ----------------- беззнаковый интервал _VAO,_VBO; const без знака int _id_vao = 1; const без знака int _id_vbo = 1; glGenBuffers(_id_vbo, &_VBO); //// Генерация и связывание VAO glGenVertexArrays(_id_vao, &_VAO); glBindVertexArray (_VAO); // Генерация и связывание VBO glBindBuffer (GL_ARRAY_BUFFER, _VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(вершины), вершины, GL_STATIC_DRAW); // Количество вершин glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray (0); glBindBuffer (GL_ARRAY_BUFFER, 0); glBindVertexArray (0); // ---------------------------------------------------------------- ----------------- // Цикл рендеринга в то время как (!glfwWindowShouldClose(_window)) { если (glfwGetKey(_window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose (_window, true); glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear (GL_COLOR_BUFFER_BIT); программа.Использовать(); glBindVertexArray (_VAO); glDrawArrays (GL_TRIANGLES, 0, 3); glBindVertexArray (0); glfwSwapBuffers (_window); glfwPollEvents(); } }
Мобильная версия