gpt4 book ai didi

c++ - OpenGL三角形未绘制

转载 作者:行者123 更新时间:2023-12-02 10:11:15 26 4
gpt4 key购买 nike

我正在尝试在屏幕上绘制一个简单的三角形。窗口设置正确,一切似乎还可以,我正在尝试实际绘制东西。我有以下代码,但是由于某些原因它无法正常工作。default_shader_program是在功能代码后显示的程序链接着色器的程序

void window::run(void(*update)(), void(*draw)()) {
while (glfwWindowShouldClose(wnd) == 0)
{

update();
glClear(GL_COLOR_BUFFER_BIT);
draw();
GLuint vb;
GLfloat data[12]{
1.f, 1.f, 0.f,
1.f, -1.f, 0.f,
-1.f, 0.f, 0.f
};


glGenBuffers(1, &vb);
glBindBuffer(GL_ARRAY_BUFFER, vb);
glBufferData(GL_ARRAY_BUFFER, 12, data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
GLuint va;
glGenVertexArrays(1, &va);
glBindVertexArray(va);

glUseProgram(default_shader_program);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vb);
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
);

glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);

glfwSwapBuffers(wnd);
glfwPollEvents();
}

glfwDestroyWindow(wnd);
}
着色器:
顶点着色器:
#version 330 core
layout(location=0) in vec3 vertexPosition;

void main() {
gl_Position = vec4(vertexPosition, 1);
}
碎片粉碎机:
#version 330 core
out vec3 color;

void main() {
color = vec3(1.0, 0.0, 0.0);
}
是的,我知道,我正在缓冲数据并在while循环中做其他事情。我知道,不应该那样做,但是实际问题发生在其他地方,我想看看代码是否可以在循环内直接正常工作。

最佳答案

您的数组包含9个元素而不是12个,但这不会引起问题。
glBufferData 的第二个参数是缓冲区大小(以字节为单位)。因此,缓冲区的大小是9*sizeof(GLfloat)而不是12:glBufferData(GL_ARRAY_BUFFER, 12, data, GL_STATIC_DRAW);

glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(GLfloat), data, GL_STATIC_DRAW);

关于c++ - OpenGL三角形未绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63474929/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com