Я пытаюсь выяснить трафареты. Прямо сейчас я просто рисую несколько коробок со значениями трафарета, а затем читаю значение. Каждый раз, когда я вызываю glReadPixels с GL_STENCIL_INDEX, я получаю GL_INVALID_OPERATION. Вот код, о котором идет речь:glreadpixels буфер трафарета всегда выбрасывает 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 и перешли в list of glReadPixels Errors 7 раз. (Да, OGL 2.1) Если я изменю STENCIL_INDEX на DEPTH_COMPONENT, он отлично работает. Единственное, что я не могу подтвердить, если у меня есть буфер трафарета. Есть ли какая-то инициализация, которую я пропускаю, или какой-либо glGet, чтобы проверить это?
Потенциально актуальная информация: Win7 x64 SP1 | ASUS GTX650Ti | VS2012 Окончательный
Вот код для функции, чтобы рисовать коробки, в случае, если это вызвано:
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 сделал неправильную вещь без видимой причины, но это нарушает мой план кодирования интерфейса.
Да, я использую SDL, теперь я должен вызвать SDL_GL_SetAttribute (SDL_GL_STENCIL_SIZE, 8). Теперь он отлично работает. Спасибо, сэр! Увы, я не могу поддерживать, потому что у меня нет 15 репутации. – tmo7452