Я пишу код для проверки концепции. Я хочу доказать, что я могу записать данные в буферный объект после того, как буфер был создан. Тем не менее, я получаю код ошибки GLenum 1280, когда я пытаюсь разархивировать буфер после записи в него. Я совершенно в тупике.
Я могу инициализировать буфер с данными о цвете и успешно отрендерить его. Проблема в том, что я не могу изменить данные в буфере впоследствии. Код ниже. Он показывает, как я записываю новые данные в буфер, а затем, как я пытаюсь прочитать их обратно. Коды ошибок отображаются в комментариях после вызова glGetError (). Переменная "cbo" является буфером цвета:
//NEW COLOR DATA
GLubyte colorData2[9] = {255,255,0, 0,128,255, 255,0,255};
//WRITE THE DATA TO THE COLOR BUFFER OBJECT (variable cbo)
glBindBuffer(GL_ARRAY_BUFFER, cbo);
int err1 = glGetError(); //Error code 0
//Oddly, glMapBuffer always returns and invalid pointer.
//GLvoid * pColor = glMapBuffer(GL_ARRAY_BUFFER, GL_MAP_WRITE_BIT);
//However, glMapBufferRange return a pointer that looks good
GLvoid * pColor = glMapBufferRange(GL_ARRAY_BUFFER, 0, 9, GL_MAP_WRITE_BIT);
int err2 = glGetError(); //Error code 0
// Copy colors from host to device
memcpy(pColor, colorData2, 9);
//Unmap to force host to device copy
glUnmapBuffer(cbo);
int err3 = glGetError(); //Error code 1280
//Unbind
glBindBuffer(GL_ARRAY_BUFFER, 0);
int err4 = glGetError(); //Error code 0
//******TEST THE WRITE******
GLubyte readbackData[9];
glBindBuffer(GL_ARRAY_BUFFER, cbo);
int err5 = glGetError(); //Error code 0
GLvoid * pColorX = glMapBufferRange(GL_ARRAY_BUFFER, 0, 9, GL_MAP_READ_BIT);
int err6 = glGetError(); //Error code 1282
//Mem copy halts because of a memory exception.
memcpy(readbackData, pColorX, 9);
glUnmapBuffer(cbo);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Вот код, в котором я создал буферный объект:
//Create color buffer
glGenBuffers(1, &cbo);
glBindBuffer(GL_ARRAY_BUFFER, cbo);
//Create space for three RGB 8-bit color objects
colorBufferSize = 3 * numColorChannels * sizeof(GLubyte);
glBufferData(GL_ARRAY_BUFFER, colorBufferSize, colorData, GL_DYNAMIC_DRAW);
//Unbind
glBindBuffer(GL_ARRAY_BUFFER, 0);