Проблемы c++/OpenGL VAO
#define GLEW_STATIC
#include <GLglew.h>
#include <GLFWglfw3.h>
#include <GLglew.h>
#include <glm.hpp>
#include <iostream>
#include <fstream>
#include <string>
#define WIDTH 800
#define HEIGHT 600
#define TITLE "Dynamic"
GLFWwindow* window;
int vaoID;
float vertices[] = {-0.5f, 0.5f, 0, -0.5f, -0.5f, 0, 0.5f, 0.5f, 0, 0.5f, 0.5f, 0, -0.5f, -0.5f, 0, 0.5f, -0.5f, 0};
void loadToVAO(float vertices[]);
void update() {
loadToVAO(vertices);
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(1, 0, 0, 1);
glDrawArrays(GL_TRIANGLES, 0, 6);
glfwSwapBuffers(window);
}
}
int main() {
if (!glfwInit())
std::cout << "Couldn't initialize GLFW!" << std::endl;
window = glfwCreateWindow(WIDTH, HEIGHT, TITLE, NULL, NULL);
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
if (GLEW_OK != glewInit())
std::cout << "GLEW fucked up!" << std::endl;
std::cout << "Your GL version: " << glGetString(GL_VERSION) << std::endl;
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
update();
}
void loadShaders() {
}
void loadToVAO(float vertices[]) {
GLuint vboID;
GLuint vaoID;
glGenBuffers(1, &vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) * 8, vertices, GL_STATIC_DRAW);
glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);
std::cout << vaoID << std::endl;
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
glEnableVertexAttribArray(0);
}
Это мой код для создания и визуализации VAO, который содержит VBO с позициями вершин. Но, к сожалению, это не работает. Он рисует треугольник вместо квадрата. Но когда я помещаю код функции loadToVAO в функцию update перед циклом while, он работает.
1 ответ:
Оператор
sizeof
всегда возвращает размер базового типа. Когда вы копируете содержимоеloadToVAO
в функцию обновления,sizeof(vertices)
в основномsizeof(float[18])
, что является общим размером массива.Но внутри
loadToVAO
,sizeof(vertices)
принимает параметр функцииvertices
в качестве входных данных, а не глобальную переменную. Поскольку параметры массива неопределенного размера в C++ рассматриваются как точки одного и того же типа, мы имеем здесь:sizeof(vertices) == sizeof(float[]) == sizeof(float*)
Который является размером указателя (4 или 8), а не размером данных больше нет.
Чтобы решить эту проблему, вы можете либо передать размер массива также в функцию, что является способом C. Более современный способ заключается в использовании
std::array
илиstd::vector
для хранения данных в первую очередь.Edit: при втором взгляде я увидел, что вы использовали
sizeof(vertices) * 8
в первую очередь. Я не совсем уверен, откуда берется 8, так как у вас нет ни 8 элементов, ни поплавок имеет размер 8 байт.