gpt4 book ai didi

c - OpenGL 3.3 - glDrawArrays 之后无效操作错误 (1282)

转载 作者:行者123 更新时间:2023-12-01 19:51:36 26 4
gpt4 key购买 nike

我正在使用freeglut。我之前已经使用着色器程序在单个 VBO 中成功渲染了一个三角形。

着色器程序编译、链接和验证没有抛出任何错误。我相信问题在于我存储和调用 VBO(其中 2 个)的方式,因为之前我只使用 1 个 VBO。

编辑:删除所有不必要的代码

#include <GL/glew.h>
#include <GL/freeglut.h>
#include <string.h>
#include <stdio.h>

#define countof(x) sizeof(x) / sizeof(x[0])

#define NUM_BUFFERS 2
#define INFOLOG_SIZE 1024

GLuint VBO_ids[NUM_BUFFERS];
GLfloat VBO0[] = {-1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f};
GLfloat VBO1[] = {-1.0f,-1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,-1.0f, 0.0f};
GLfloat *VBOs[NUM_BUFFERS] = { VBO0, VBO1 };
GLuint shader_prog_id;

const GLchar *vert_src =
"#version 330\n"
"layout (location = 0) in vec3 Pos;\n"
"void main() {\n"
" gl_Position = vec4(Pos.x, Pos.y, Pos.z, 1.0); }\n";

const GLchar *frag_src =
"#version 330\n"
"out vec4 FragColor;\n"
"void main() {\n"
" FragColor = vec4(1.0, 1.0, 1.0, 1.0); }\n";

void vbo_init(void) {
glGenBuffers(NUM_BUFFERS, VBO_ids);
glBindBuffer(GL_ARRAY_BUFFER, VBO_ids[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(VBO0), VBOs[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, VBO_ids[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(VBO1), VBOs[1], GL_STATIC_DRAW); }

int shader_init(const GLchar **v_src, const GLchar **f_src, GLint *v_size, GLint *f_size) {
GLint success;
shader_prog_id = glCreateProgram();
GLuint v_shader = glCreateShader(GL_VERTEX_SHADER);
GLuint f_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(v_shader, 1, v_src, v_size);
glShaderSource(f_shader, 1, f_src, f_size);
glCompileShader(v_shader);
glCompileShader(f_shader);
glAttachShader(shader_prog_id, v_shader);
glAttachShader(shader_prog_id, f_shader);
glLinkProgram(shader_prog_id);
glValidateProgram(shader_prog_id);
return 1; }

int draw_initialize(void) {
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
vbo_init();
GLint vsrcsize = strlen(vert_src);
GLint fsrcsize = strlen(frag_src);
shader_init(&vert_src, &frag_src, &vsrcsize, &fsrcsize);
return 1; }

void draw_callback(void) {
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shader_prog_id);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER, VBO_ids[0]);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glDrawArrays(GL_TRIANGLES, 0, countof(VBO0)/3);
puts((char*)gluErrorString(glGetError()));
glBindBuffer(GL_ARRAY_BUFFER, VBO_ids[1]);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glDrawArrays(GL_TRIANGLES, 0, countof(VBO1)/3);

glDisableVertexAttribArray(0);
glutSwapBuffers(); }

int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitContextFlags(GLUT_FORWARD_COMPATIBLE);
glutInitContextProfile(GLUT_CORE_PROFILE);
glutInitContextVersion(3, 3);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize(600, 600);
glutCreateWindow("title");

glewInit();
draw_initialize();

glutIdleFunc(draw_callback);
glutMainLoop();
return 0; }

最佳答案

您需要提供Vertex Array Object (VAO)在核心上下文中:

int draw_initialize(void)
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
vbo_init();
GLint vsrcsize = strlen(vert_src);
GLint fsrcsize = strlen(frag_src);
shader_init(&vert_src, &frag_src, &vsrcsize, &fsrcsize);

GLuint vao = 0;
glGenVertexArrays( 1, &vao );
glBindVertexArray( vao );

return 1;
}

它们封装了顶点属性启用 (glEnableVertexAttribArray()) 和指针 (glVertexAttribPointer()) 状态。

另外:

  • glewExperimental = GL_TRUEglewInit() 之前
  • 设置一个实际的 glutDisplayFunc(),而不是希望 GLUT 通过仅注册一个空闲回调来弄清楚您的意思

关于c - OpenGL 3.3 - glDrawArrays 之后无效操作错误 (1282),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32525738/

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