为什么在 GLFW window 中使用此代码在我的屏幕上没有绘制任何立方体?
How come no cube is drawn on my screen with this code in a GLFW window?
我有一堆代码(从各种教程中复制)应该绘制一个随机变色的立方体,相机每秒左右移动一次(有一个变量,还没有使用定时器)。在我将我的代码移动到独特的 classes 并将其全部推入我的主要功能之前,它在过去工作,但现在我在主要 window 上除了空白背景之外看不到任何东西。我无法在这里查明任何特定问题,因为我没有收到任何错误或异常,并且我自己定义的代码已检查;当我调试时,每个变量都有一个我期望的值,并且在我重新组织代码之前,我使用的着色器(以字符串形式)在过去工作。我也可以在与 glDrawArrays()
函数相同的范围内打印出立方体的顶点,并且它们也具有正确的值。基本上,我不知道我的代码有什么问题导致无法绘制任何内容。
我最好的猜测是,我在 Model
class 的三种方法之一中使用错误数据调用了(或忘记调用了)某些 opengl 函数。在我的程序中,我创建了一个 Model
对象(在初始化 glfw 和 glad 之后,然后调用 Model
构造函数),每隔一段时间(时间无关紧要)通过 update()
函数,然后每次我的主循环是 运行 通过 draw()
函数将它绘制到我的屏幕上。
代码错误的可能位置:
Model::Model(std::vector<GLfloat> vertexBufferData, std::vector<GLfloat> colorBufferData) {
mVertexBufferData = vertexBufferData;
mColorBufferData = colorBufferData;
// Generate 1 buffer, put the resulting identifier in vertexbuffer
glGenBuffers(1, &VBO);
// The following commands will talk about our 'vertexbuffer' buffer
glBindBuffer(GL_ARRAY_BUFFER, VBO);
// Give our vertices to OpenGL.
glBufferData(GL_ARRAY_BUFFER, sizeof(mVertexBufferData), &mVertexBufferData.front(), GL_STATIC_DRAW);
glGenBuffers(1, &CBO);
glBindBuffer(GL_ARRAY_BUFFER, CBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(mColorBufferData), &mColorBufferData.front(), GL_STATIC_DRAW);
// Create and compile our GLSL program from the shaders
programID = loadShaders(zachos::DATA_DEF);
glUseProgram(programID);
}
void Model::update() {
for (int v = 0; v < 12 * 3; v++) {
mColorBufferData[3 * v + 0] = (float)std::rand() / RAND_MAX;
mColorBufferData[3 * v + 1] = (float)std::rand() / RAND_MAX;
mColorBufferData[3 * v + 2] = (float)std::rand() / RAND_MAX;
}
glBufferData(GL_ARRAY_BUFFER, sizeof(mColorBufferData), &mColorBufferData.front(), GL_STATIC_DRAW);
}
void Model::draw() {
// Setup some 3D stuff
glm::mat4 mvp = Mainframe::projection * Mainframe::view * model;
GLuint MatrixID = glGetUniformLocation(programID, "MVP");
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &mvp[0][0]);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(
0, // attribute 0. No particular reason for 0, but must match the layout in the shader.
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, CBO);
glVertexAttribPointer(
1, // attribute. No particular reason for 1, but must match the layout in the shader.
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);
// Draw the array
glDrawArrays(GL_TRIANGLES, 0, mVertexBufferData.size() / 3);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
};
我的问题很简单,为什么我的程序不会在屏幕上绘制立方体?问题是在这三个功能中还是在其他地方?如果需要,我可以提供有关绘图过程的更多一般信息,但我相信我提供的代码已经足够了,因为我实际上只是调用 model.draw()
.
sizeof(std::vector) 通常只有 24 个字节(因为结构通常包含 3 个指针)。所以基本上你的两个缓冲区都加载了 6 个浮点数,这对于单个三角形来说是不够的,更不用说立方体了!
在将数据加载到顶点缓冲区时,您应该改为在向量上调用 size()。
glBufferData(GL_ARRAY_BUFFER,
mVertexBufferData.size() * sizeof(float), ///< this!
mVertexBufferData.data(), ///< prefer calling data() here!
GL_STATIC_DRAW);
我有一堆代码(从各种教程中复制)应该绘制一个随机变色的立方体,相机每秒左右移动一次(有一个变量,还没有使用定时器)。在我将我的代码移动到独特的 classes 并将其全部推入我的主要功能之前,它在过去工作,但现在我在主要 window 上除了空白背景之外看不到任何东西。我无法在这里查明任何特定问题,因为我没有收到任何错误或异常,并且我自己定义的代码已检查;当我调试时,每个变量都有一个我期望的值,并且在我重新组织代码之前,我使用的着色器(以字符串形式)在过去工作。我也可以在与 glDrawArrays()
函数相同的范围内打印出立方体的顶点,并且它们也具有正确的值。基本上,我不知道我的代码有什么问题导致无法绘制任何内容。
我最好的猜测是,我在 Model
class 的三种方法之一中使用错误数据调用了(或忘记调用了)某些 opengl 函数。在我的程序中,我创建了一个 Model
对象(在初始化 glfw 和 glad 之后,然后调用 Model
构造函数),每隔一段时间(时间无关紧要)通过 update()
函数,然后每次我的主循环是 运行 通过 draw()
函数将它绘制到我的屏幕上。
代码错误的可能位置:
Model::Model(std::vector<GLfloat> vertexBufferData, std::vector<GLfloat> colorBufferData) {
mVertexBufferData = vertexBufferData;
mColorBufferData = colorBufferData;
// Generate 1 buffer, put the resulting identifier in vertexbuffer
glGenBuffers(1, &VBO);
// The following commands will talk about our 'vertexbuffer' buffer
glBindBuffer(GL_ARRAY_BUFFER, VBO);
// Give our vertices to OpenGL.
glBufferData(GL_ARRAY_BUFFER, sizeof(mVertexBufferData), &mVertexBufferData.front(), GL_STATIC_DRAW);
glGenBuffers(1, &CBO);
glBindBuffer(GL_ARRAY_BUFFER, CBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(mColorBufferData), &mColorBufferData.front(), GL_STATIC_DRAW);
// Create and compile our GLSL program from the shaders
programID = loadShaders(zachos::DATA_DEF);
glUseProgram(programID);
}
void Model::update() {
for (int v = 0; v < 12 * 3; v++) {
mColorBufferData[3 * v + 0] = (float)std::rand() / RAND_MAX;
mColorBufferData[3 * v + 1] = (float)std::rand() / RAND_MAX;
mColorBufferData[3 * v + 2] = (float)std::rand() / RAND_MAX;
}
glBufferData(GL_ARRAY_BUFFER, sizeof(mColorBufferData), &mColorBufferData.front(), GL_STATIC_DRAW);
}
void Model::draw() {
// Setup some 3D stuff
glm::mat4 mvp = Mainframe::projection * Mainframe::view * model;
GLuint MatrixID = glGetUniformLocation(programID, "MVP");
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &mvp[0][0]);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(
0, // attribute 0. No particular reason for 0, but must match the layout in the shader.
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, CBO);
glVertexAttribPointer(
1, // attribute. No particular reason for 1, but must match the layout in the shader.
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);
// Draw the array
glDrawArrays(GL_TRIANGLES, 0, mVertexBufferData.size() / 3);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
};
我的问题很简单,为什么我的程序不会在屏幕上绘制立方体?问题是在这三个功能中还是在其他地方?如果需要,我可以提供有关绘图过程的更多一般信息,但我相信我提供的代码已经足够了,因为我实际上只是调用 model.draw()
.
sizeof(std::vector) 通常只有 24 个字节(因为结构通常包含 3 个指针)。所以基本上你的两个缓冲区都加载了 6 个浮点数,这对于单个三角形来说是不够的,更不用说立方体了!
在将数据加载到顶点缓冲区时,您应该改为在向量上调用 size()。
glBufferData(GL_ARRAY_BUFFER,
mVertexBufferData.size() * sizeof(float), ///< this!
mVertexBufferData.data(), ///< prefer calling data() here!
GL_STATIC_DRAW);