Проблема выбора цветовой кодировки в OpenGL

Я делаю игру, на самом деле очень простую копию Minecraft, для своего классного проекта. Сейчас я застрял в процессе выбора, который позволит мне разрушать и создавать блоки в игровой среде.

Я пытался использовать собственный режим выбора OpenGL без какого-либо успеха, и создание моего собственного средства выбора лучей с использованием математических библиотек кажется большой работой для проекта такого размера. Итак, я решил использовать метод выбора с цветовой кодировкой, который состоит в том, чтобы отображать каждый выбираемый объект в другом цвете, затем получать цвет в позиции мыши и использовать его для идентификации выбранного объекта.

Мой текущий интерфейс — это просто 3D-рендеринг множества ящиков, сложенных друг на друга, создающих структуру, похожую на ландшафт. Поскольку я еще не накладывал текстуру, все прямоугольники окрашены в оттенки серого (освещение включено).

Теперь время для реального кода:

Это часть инициализации, включающая текстурирование, освещение и т. д.

glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);

Когда кнопка мыши нажата, я пытаюсь получить цвет в позиции курсора мыши (фактически всегда в середине окна) следующим образом:

glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);   
glDisable(GL_DITHER);
glDisable(GL_LIGHT0);
glDisable(GL_LIGHT1);
    renderColors();
    GLubyte pixels[3];
    glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, (void *)pixels); 
glEnable(GL_TEXTURE_2D);
glEnable(GL_LIGHTING);
glEnable(GL_DITHER);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);

Проблема в том, что отключения не работают, и я всегда получаю значения RGB разных оттенков серого в своем массиве pixels.

В чем может быть проблема?


person Dunya Degirmenci    schedule 28.12.2010    source источник


Ответы (1)


Возможно, вы забыли очистить цветовой буфер и отключить буфер глубины, и все ваши визуализированные цвета вызывают Z-Fighting или вообще не визуализируются (если z-тест «меньше»). Попробуйте добавить код swapbuffers и посмотрите, что будет отображаться после вашего кода ColorRender.

person Kromster    schedule 15.01.2011