首页 > 解决方案 > glDrawArrays 抛出 1282 错误并且不绘制任何东西

问题描述

我检查了这个问题。

gldrawarrays 不绘制任何东西=> 不适用,因为我正在使用着色器。

我的代码如下:

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

这首先初始化一个 vao。

GLuint vertexBuffer;
glGenBuffers(1,&vertexBuffer);


float vertices[]={
  -0.5f,-0.5f,
  0.0f,0.0f,
  0.5f,0.5f
};

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);    

绑定缓冲区并添加数据

const char* vertexSource = reader("./shaders/chapter-one.vert").c_str();
GLuint vShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vShader, 1, &vertexSource, NULL);
glCompileShader(vShader);
GLint vStatus;
glGetShaderiv(vShader, GL_COMPILE_STATUS, &vStatus);
if(vStatus!=GL_TRUE){
  printf("Vertex Shader not Compiled\n");
}

char vBuffer[512];
glGetShaderInfoLog(vShader, 512, NULL, vBuffer);
cout<<vBuffer;


const char* fragmentSource = reader("./shaders/chapter-one.frag").c_str();
GLuint fShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fShader, 1, &fragmentSource, NULL);
glCompileShader(fShader);
GLint fStatus;
glGetShaderiv(fShader, GL_COMPILE_STATUS, &fStatus);
if(fStatus!=GL_TRUE){
  printf("Fragment Shader not compiled");
}

char fBuffer[512];
glGetShaderInfoLog(fShader, 512, NULL, fBuffer);
cout << fBuffer;

GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vShader);
glAttachShader(shaderProgram, fShader);
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);

添加着色器并创建程序。我还检索当前为空的每个步骤的错误和日志。所以编译或创建着色器和程序没有错误。

GLuint posLoc = glGetAttribLocation(shaderProgram, "p");
printf("%i\n", posLoc);
glVertexAttribPointer(posLoc, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(posLoc);

从着色器获取属性以提供数据。

glDrawArrays(GL_LINES, 0, 3); // => This part does not work

在我收到 1282 错误glGetError()后调用。glDrawArrays我知道在我尝试调用glDrawArrays之前导致此错误并且没有错误。我认为问题出在某个地方glDrawArraysglGetErrors()

有什么建议么??

编辑:我尝试根据 Rabbid76 的建议更改我的代码,但我仍然遇到同样的错误。我检查了文档,我认为这是适用的情况。

如果非零缓冲区对象名称绑定到启用的数组并且缓冲区对象的数据存储当前已映射,则会生成 GL_INVALID_OPERATION。

在这种情况下这意味着什么,我应该做出哪些改变?

完整代码在这里

是的,我把我的代码和示例代码放在一起,并改变了任何看起来不一致的地方。我改变了两者glDrawElements,不得不调整我的glVertexAttribPointer. 愚蠢的错误。谢谢你。

标签: c++opengl

解决方案


您的代码中没有glDrawArrays。只有一个glDrawElementsand 会导致错误,因为您没有指定任何Index buffer
此外,类型参数必须glDrawElements是索引的类型。允许的类型是GL_UNSIGNED_BYTEGL_UNSIGNED_SHORTGL_UNSIGNED_INT

删除glDrawElements并使用glDrawArrays以解决问题:

glDrawElements(GL_TRIANGLES, 3, GL_FLOAT, 0);

glDrawArrays(GL_TRIANGLES, 0, 3);

此外,在调用之前,必须绑定顶点缓冲区对象顶点数组对象glVertexAttribPointerglVertexAttribPointer将当前绑定到目标的缓冲区与指定的属性(索引)相关联,并在Vertex Array ObjectGL_ARRAY_BUFFER的状态向量中声明规范。

glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
glVertexAttribPointer(posLoc, 2, GL_FLOAT, GL_FALSE, 0, 0);

推荐阅读