c++ - 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
之前导致此错误并且没有错误。我认为问题出在某个地方glDrawArrays
glGetErrors()
有什么建议么??
编辑:我尝试根据 Rabbid76 的建议更改我的代码,但我仍然遇到同样的错误。我检查了文档,我认为这是适用的情况。
如果非零缓冲区对象名称绑定到启用的数组并且缓冲区对象的数据存储当前已映射,则会生成 GL_INVALID_OPERATION。
在这种情况下这意味着什么,我应该做出哪些改变?
完整代码在这里
是的,我把我的代码和示例代码放在一起,并改变了任何看起来不一致的地方。我改变了两者glDrawElements
,不得不调整我的glVertexAttribPointer
. 愚蠢的错误。谢谢你。
解决方案
您的代码中没有glDrawArrays
。只有一个glDrawElements
and 会导致错误,因为您没有指定任何Index buffer。
此外,类型参数必须glDrawElements
是索引的类型。允许的类型是GL_UNSIGNED_BYTE
、GL_UNSIGNED_SHORT
或GL_UNSIGNED_INT
。
删除glDrawElements
并使用glDrawArrays
以解决问题:
glDrawElements(GL_TRIANGLES, 3, GL_FLOAT, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
此外,在调用之前,必须绑定顶点缓冲区对象和顶点数组对象glVertexAttribPointer
。glVertexAttribPointer
将当前绑定到目标的缓冲区与指定的属性(索引)相关联,并在Vertex Array ObjectGL_ARRAY_BUFFER
的状态向量中声明规范。
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexAttribPointer(posLoc, 2, GL_FLOAT, GL_FALSE, 0, 0);
推荐阅读
- python - “掌握 Matplotlib”一书中的 python 类型检查模块
- c - 为什么当 COLOR_PAIR 超过 200 或更高时,这对 ncurses 的 init_pair 会被破坏
- swift - 如何定义一个空的、“未初始化的”键路径并在以后设置?
- python - tkinter- HTML 编辑器中的自动完成错误
- c++ - 如何通过复制构造函数复制内置数组?
- visual-studio - 如何在 VS 2019 中打开小地图滑块?
- python - 使用 Apache 束 `GroupByKey` 并构造一个新列 - Python
- php - 使用 SQLT_BDOUBLE (Oracle BINARY_DOUBLE) 的 PHP OCI8 oci_bind_array_by_name 问题
- google-cloud-platform - 尝试在 VertexAI 管道中使用 CustomPythonPackageTrainingJobRunOp 时出错
- r - 如何按列分组并使用 R 中的 dplyr 在该列中创建不同的组