C++/OpenGL VAO 问题
C++/OpenGL VAO Problems
#define GLEW_STATIC
#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <GL\glew.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);
}
这是我创建和渲染包含带顶点位置的 VBO 的 VAO 的代码。但不幸的是它不起作用。它绘制一个三角形而不是四边形。但是当我把 loadToVAO 函数的代码放在 while 循环之前的更新函数中时,它起作用了。
sizeof
运算符始终 returns 基础类型的大小。当你将loadToVAO
的内容复制到update函数中时,sizeof(vertices)
基本上就是sizeof(float[18])
,也就是数组的总大小
但在 loadToVAO
内部,sizeof(vertices)
将函数参数 vertices
作为输入而不是全局变量。由于 C++ 中未定义大小的数组参数被视为与我们此处具有相同类型的点:
sizeof(vertices) == sizeof(float[]) == sizeof(float*)
这是指针的大小(4 或 8),不再是数据的大小。
要解决这个问题,您可以将数组的大小也传递给函数,这是 C 的方法。更现代的方法是首先使用 std::array
或 std::vector
来存储数据。
编辑:再看一眼,我发现您首先使用了 sizeof(vertices) * 8
。我不太确定 8 从何而来,因为您既没有 8 个元素,也没有 float 的大小为 8 个字节。
#define GLEW_STATIC
#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <GL\glew.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);
}
这是我创建和渲染包含带顶点位置的 VBO 的 VAO 的代码。但不幸的是它不起作用。它绘制一个三角形而不是四边形。但是当我把 loadToVAO 函数的代码放在 while 循环之前的更新函数中时,它起作用了。
sizeof
运算符始终 returns 基础类型的大小。当你将loadToVAO
的内容复制到update函数中时,sizeof(vertices)
基本上就是sizeof(float[18])
,也就是数组的总大小
但在 loadToVAO
内部,sizeof(vertices)
将函数参数 vertices
作为输入而不是全局变量。由于 C++ 中未定义大小的数组参数被视为与我们此处具有相同类型的点:
sizeof(vertices) == sizeof(float[]) == sizeof(float*)
这是指针的大小(4 或 8),不再是数据的大小。
要解决这个问题,您可以将数组的大小也传递给函数,这是 C 的方法。更现代的方法是首先使用 std::array
或 std::vector
来存储数据。
编辑:再看一眼,我发现您首先使用了 sizeof(vertices) * 8
。我不太确定 8 从何而来,因为您既没有 8 个元素,也没有 float 的大小为 8 个字节。