шаблонный буфер glreadpixels всегда выдает GL_INVALID_OPERATION

Я пытаюсь выяснить трафареты. Сейчас я просто рисую несколько блоков со значениями трафарета, а затем читаю значение. Каждый раз, когда я вызываю glReadPixels с GL_STENCIL_INDEX, я получаю GL_INVALID_OPERATION. Вот код, о котором идет речь:

glPixelStorei(GL_PACK_ALIGNMENT, 1);
GLfloat tempStencilVal = 3;
glGetError();
glReadPixels(10, g_window1Height-10, 1, 1, GL_STENCIL_INDEX, GL_FLOAT, &tempStencilVal);
if (glGetError() == GL_INVALID_OPERATION) {std::cout << "GL Invalid Operation\n";}
else {std::cout << "X: " << 10 << " Y: " << 10 << " S: " << tempStencilVal << "\n";}

Я пробовал 5 разных форматов данных, 3 разных режима glPixelStore и прошел через список ошибок glReadPixels 7 раз. (Да, OGL 2.1). Если я изменю STENCIL_INDEX на DEPTH_COMPONENT, он будет работать нормально. Единственное, что я не могу подтвердить, это наличие у меня трафаретного буфера. Есть какая-то инициализация, которую я пропускаю или какой-то glGet, чтобы проверить это?

Потенциально актуальная информация: Win7 x64 SP1 | ASUS GTX650Ti | VS2012 Ultimate

Вот код для функции рисования блоков, в случае, если это вызывает это:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, g_window1Width, -g_window1Height, 0, 0.0, 50.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glScaled(1.0, -1.0, -1.0);
glTranslated(0.0, 0.0, 0.5);

glClearColor(0.0, 0.0, 0.0, 0.0);
glClearStencil(0);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

glDisable(GL_DEPTH_TEST);
glEnable(GL_STENCIL_TEST);
glStencilOp( GL_REPLACE, GL_REPLACE, GL_REPLACE );

glColor3ub(0, 100, 250);

glStencilFunc(GL_ALWAYS, 1, 1);
glBegin(GL_QUADS);
glVertex3d(0, 0, 0);
glVertex3d(0, 50, 0);
glVertex3d(50, 50, 0);
glVertex3d(50, 0, 0);
glEnd();

glStencilFunc(GL_ALWAYS, 1, 1);
glBegin(GL_QUADS);
glVertex3d(g_window1Width-50, 0, 0);
glVertex3d(g_window1Width, 0, 0);
glVertex3d(g_window1Width, 50, 0);
glVertex3d(g_window1Width-50, 50, 0);
glEnd();

Это не первый раз, когда OGL делает неправильные вещи без видимой причины, но это нарушает мой план кодирования интерфейса.

3

Решение

Чтобы проверить, есть ли у вас трафаретный буфер, вы можете попробовать что-то сделать со значениями, например нарисовать другой квад с glStencilFunc(GL_NOTEQUAL, 1, 1); с включенным тестом трафарета и без него.

Чтобы найти фактический используемый формат, как вы говорите с glGet..., это выглядит как glGetFramebufferAttachmentParameter даст вам ответ (с привязкой кадрового буфера по умолчанию).

Трафаретный буфер 8 бит (я не думаю, что это может быть что-то еще), поэтому, возможно, измените формат на GL_UNSIGNED_BYTE,

Также возможно смешивать буферы глубины и трафарета с GL_DEPTH_STENCIL, для которого вы могли бы использовать GL_UNSIGNED_INT_24_8, Я не знаю, какой формат имеет стандартный фреймбуфер, или это будет работать в вашем случае. Если вы используете библиотеку, такую ​​как glut, SDL или glfw, она отвечает за настройку и где вы должны искать для настройки буфера кадров по умолчанию.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]