glDrawArrays выдает ошибку 1282 и ничего не рисует - PullRequest
1 голос
/ 03 апреля 2020

Я проверял этот вопрос.

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

При вызове glGetError() после glDrawArrays Я получаю Ошибка 1282. Я знаю, что glDrawArrays вызывает эту ошибку, как и раньше glDrawArrays Я пытался позвонить glGetErrors(), и ошибок не было. Я думаю, что проблема в настройке где-то

Любые предложения ??

Редактировать: Я пытался изменить свой код в соответствии с предложением Rabbid76, и я все еще получаю ту же ошибку. Я проверил документацию и думаю, что это применимый случай.

GL_INVALID_OPERATION генерируется, если ненулевое имя объекта буфера привязано к включенному массиву и данным объекта буфера Магазин в настоящее время сопоставлен.

Что это значит в этой ситуации и какие изменения я должен внести?

Полный код здесь

Да, я получил оба мой код и пример кода бок о бок и изменили все, что казалось несовместимым. Я изменил оба glDrawElements и мне пришлось настроить glVertexAttribPointer. Глупая ошибка. Спасибо.

1 Ответ

2 голосов
/ 03 апреля 2020

В вашем коде нет glDrawArrays. Существует только glDrawElements, и это вызовет ошибку, поскольку вы не указали буфер индекса .
Кроме того, аргумент типа glDrawElements должен быть типом индексов. Допустимые типы: GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT или GL_UNSIGNED_INT.

Удалите glDrawElements и используйте glDrawArrays для решения проблемы:

glDrawElements(GL_TRIANGLES, 3, GL_FLOAT, 0);

glDrawArrays(GL_TRIANGLES, 0, 3);

Кроме того Объект Vertex Buffer и объект Vertex Array должны быть связаны перед вызовом glVertexAttribPointer. glVertexAttribPointer связывает буфер, который в настоящее время привязан к цели GL_ARRAY_BUFFER, с указанным атрибутом (индексом) и указывает спецификацию в векторе состояния Vertex Array Object .

glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
glVertexAttribPointer(posLoc, 2, GL_FLOAT, GL_FALSE, 0, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...