C++/OpenGL VAO Problems(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);
}
这是我用于创建和渲染包含具有顶点位置的 VBO 的 VAO 的代码.但不幸的是它不起作用.它绘制一个三角形而不是一个四边形.但是当我把loadToVAO函数的代码放在while循环之前的update函数中时,它就起作用了.
This is my code for creating and rendering a VAO that contains a VBO with the vertex positions. But unfortunately it doesn't work. It draws a triangle instead of a quad. But when I put the code of the loadToVAO function in the update function before the while loop, it works.
推荐答案
sizeof
运算符始终返回基础类型的大小.当你把loadToVAO
的内容复制到update函数中时,sizeof(vertices)
基本上就是sizeof(float[18])
,也就是数组的总大小.
The sizeof
operator always returns the size of the underlying type. When you copy the content of loadToVAO
to the update function, sizeof(vertices)
is basically sizeof(float[18])
, which is the total size of the array.
但是在 loadToVAO
中,sizeof(vertices)
将函数参数 vertices
作为输入而不是全局变量.由于在 C++ 中未定义大小的数组参数被视为我们这里的相同类型的点:
But inside the loadToVAO
, the sizeof(vertices)
takes the function parameter vertices
as input and not the global variable. Since array parameters of undefined size in C++ are treated as points of the same type we have here:
sizeof(vertices) == sizeof(float[]) == sizeof(float*)
它是指针的大小(4 或 8),不再是数据的大小.
which is the size of a pointer (4 or 8) and not the size of the data anymore.
要解决这个问题,您可以将数组的大小也传递给函数,这是 C 的方法.更现代的方法是首先使用 std::array
或 std::vector
来存储数据.
To solve this, you can either pass the size of the array also to the function, which is the C way to go. The more modern way is to use std::array
or std::vector
to store the data in the first place.
第二次查看时,我看到您首先使用了 sizeof(vertices) * 8
.我不太确定 8 是从哪里来的,因为你既没有 8 个元素,浮点数也没有 8 个字节的大小.
On the second look I saw that you used sizeof(vertices) * 8
in the first place. I'm not really sure where the 8 comes from, since you neither have 8 elements nor does a float have a size of 8 bytes.
这篇关于C++/OpenGL VAO 问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:C++/OpenGL VAO 问题
基础教程推荐
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 从 std::cin 读取密码 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01