当抽象为 class 时,我的 OpenGL 顶点数组不再有效
My OpenGL Vertex Array no longer works when abstracted out into a class
我正在使用 OpenGL 渲染一些立方体,我已经设法渲染了大约 10 个立方体,但是我现在想将代码抽象为 classes。我从顶点数组对象开始。
我已经查看了代码并将其跟踪到着色器,确保顶点数据到达需要的位置。
#include "cube_vertex_array.h"
cube_vertex_array::cube_vertex_array(float* vertex_buffer, const std::string& texture_file)
{
GLCall(glGenVertexArrays(1, &va_ID));
GLCall(glBindVertexArray(va_ID));
GLCall(glGenBuffers(1, &vb_ID));
GLCall(glBindBuffer(GL_ARRAY_BUFFER, vb_ID));
GLCall(glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer), vertex_buffer, GL_STATIC_DRAW));
GLCall(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(0 * sizeof(float))));
GLCall(glEnableVertexAttribArray(0));
GLCall(glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float))));
GLCall(glEnableVertexAttribArray(1));
GLCall(glGenTextures(1, &texture));
GLCall(glBindTexture(GL_TEXTURE_2D, texture));
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT));
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT));
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
int width, height, nrChanells;
stbi_set_flip_vertically_on_load(true);
unsigned char* data = stbi_load(texture_file.c_str(), &width, &height, &nrChanells, 0);
if (data)
{
GLCall(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data));
GLCall(glGenerateMipmap(GL_TEXTURE_2D));
}
else { std::cout << "failed to load texture" << std::endl; }
stbi_image_free(data);
GLCall(glBindVertexArray(0));
}
void cube_vertex_array::bind()
{
GLCall(glBindVertexArray(va_ID));
}
此外,这是使用此 class:
的 main() 部分
main()
{
cube_vertex_array cube_1(vertices, "resources/test.png");
cube_1.bind();
while (!glfwWindowShouldClose(window))
{
cube_1.bind();
GLCall(glDrawArrays(GL_TRIANGLES, 0, 36));
}
GLCall(glDeleteVertexArrays(1, &cube_1.va_ID));
GLCall(glDeleteBuffers(1, &cube_1.vb_ID));
}
我希望看到多个立方体渲染,但这并没有发生。如果我直接在主文件中实现顶点数组,代码会呈现立方体,但是当抽象为 class 时它不会呈现任何东西。这可能是什么问题?
问题是您 "call" sizeof(vertex_buffer)
在这一行:
GLCall(glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer), vertex_buffer, GL_STATIC_DRAW));
vertex_buffer
是一个指向数组的指针,所以如果你在它上面 "call" sizeof
你会得到 float*
的大小而不是元素的数量数组乘以 sizeof(float)
.
解决这个问题的一种方法是将数组的大小作为参数传递。
您可以做的另一件事是发送数组中元素的数量并将其乘以 sizeof(float).
我正在使用 OpenGL 渲染一些立方体,我已经设法渲染了大约 10 个立方体,但是我现在想将代码抽象为 classes。我从顶点数组对象开始。
我已经查看了代码并将其跟踪到着色器,确保顶点数据到达需要的位置。
#include "cube_vertex_array.h"
cube_vertex_array::cube_vertex_array(float* vertex_buffer, const std::string& texture_file)
{
GLCall(glGenVertexArrays(1, &va_ID));
GLCall(glBindVertexArray(va_ID));
GLCall(glGenBuffers(1, &vb_ID));
GLCall(glBindBuffer(GL_ARRAY_BUFFER, vb_ID));
GLCall(glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer), vertex_buffer, GL_STATIC_DRAW));
GLCall(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(0 * sizeof(float))));
GLCall(glEnableVertexAttribArray(0));
GLCall(glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float))));
GLCall(glEnableVertexAttribArray(1));
GLCall(glGenTextures(1, &texture));
GLCall(glBindTexture(GL_TEXTURE_2D, texture));
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT));
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT));
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
int width, height, nrChanells;
stbi_set_flip_vertically_on_load(true);
unsigned char* data = stbi_load(texture_file.c_str(), &width, &height, &nrChanells, 0);
if (data)
{
GLCall(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data));
GLCall(glGenerateMipmap(GL_TEXTURE_2D));
}
else { std::cout << "failed to load texture" << std::endl; }
stbi_image_free(data);
GLCall(glBindVertexArray(0));
}
void cube_vertex_array::bind()
{
GLCall(glBindVertexArray(va_ID));
}
此外,这是使用此 class:
的 main() 部分main()
{
cube_vertex_array cube_1(vertices, "resources/test.png");
cube_1.bind();
while (!glfwWindowShouldClose(window))
{
cube_1.bind();
GLCall(glDrawArrays(GL_TRIANGLES, 0, 36));
}
GLCall(glDeleteVertexArrays(1, &cube_1.va_ID));
GLCall(glDeleteBuffers(1, &cube_1.vb_ID));
}
我希望看到多个立方体渲染,但这并没有发生。如果我直接在主文件中实现顶点数组,代码会呈现立方体,但是当抽象为 class 时它不会呈现任何东西。这可能是什么问题?
问题是您 "call" sizeof(vertex_buffer)
在这一行:
GLCall(glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_buffer), vertex_buffer, GL_STATIC_DRAW));
vertex_buffer
是一个指向数组的指针,所以如果你在它上面 "call" sizeof
你会得到 float*
的大小而不是元素的数量数组乘以 sizeof(float)
.
解决这个问题的一种方法是将数组的大小作为参数传递。 您可以做的另一件事是发送数组中元素的数量并将其乘以 sizeof(float).