2013-09-30 4 views
3

Я пытаюсь выяснить трафареты. Прямо сейчас я просто рисую несколько коробок со значениями трафарета, а затем читаю значение. Каждый раз, когда я вызываю 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 сделал неправильную вещь без видимой причины, но это нарушает мой план кодирования интерфейса.

ответ

4

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

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

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

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

+0

Да, я использую SDL, теперь я должен вызвать SDL_GL_SetAttribute (SDL_GL_STENCIL_SIZE, 8). Теперь он отлично работает. Спасибо, сэр! Увы, я не могу поддерживать, потому что у меня нет 15 репутации. – tmo7452

Смежные вопросы