2013-08-26 1 views
0

Я пытаюсь нарисовать круг с OpenGL с помощью glDrawArrays и GL_POINTS. Мой круг рисуется правильно, но каждая точка имеет белую рамку (см. Снимок экрана).Получает точки с белыми границами при потоплении круга через gldrawarrays и GL_POINTS

Screenshot

Вот код:

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 
glEnable(GL_POINT_SMOOTH); 
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); 

Color* color = (Color*)colors; 

glEnableClientState(GL_VERTEX_ARRAY); 
pointSize *= this->GetScale(); 

glPointSize(pointSize); 
glColor4f(color->r/255.0f, color->g/255.0f, color->b/255.0f, 1.0f); 

glVertexPointer(2, GL_FLOAT, 0, verts); 
glDrawArrays(GL_POINTS, 0, count); 
glDisableClientState(GL_VERTEX_ARRAY); 

Я думаю, что-то не так с режимом наложения, но я не могу найти правильный. Какие-либо предложения?

ответ

0

Я считаю, что GL_POINT_SMOOTH предназначен для использования смешивания glBlendFunc (GL_SRC_ALPHA_SATURATE, GL_ONE), поскольку альфа рассчитывается как часть пикселя, который перекрывает спрайт. Буфер глубины также может влиять на рендеринг.

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

+0

Исправлена ​​ошибка маскировки glBlendFunc и отключена. Спасибо. – user1691399

0

Забавный, я фактически explained this yesterday (хотя вместо этого используется GL_POLYGON_SMOOTH). Однако проблема одна и та же.

GL_LINE_SMOOTH, GL_POLYGON_SMOOTH и GL_POINT_SMOOTH все страдают от одной серьезной проблемы, которая создает эти смешающие артефакты. Когда вы рисуете с использованием этих методов сглаживания, сглаженные края смешиваются вместе с существующим пикселем в буфере кадра. Это создает зависимую от заказа ситуацию, которая может быть разрешена только путем сортировки ваших примитивов назад и с потенциально серьезной потерей производительности из-за переустановки.

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

Если вы действительно настаиваете на использовании сглаживания точек в этой ситуации, вы должны нарисовать все свои очки дважды. Для достижения наилучших результатов вам может потребоваться отменить порядок, который вы нарисовали на первом проходе, и отключить запись глубины с использованием glDepthMask (GL_FALSE), а затем на втором этапе повторить включение записи глубины. Очевидно, что это сосать с точки зрения производительности, но эти методы не сглаживания сглаживания далеко не идеальны для начала.

+0

Исправлена ​​проблема с глубиной маски glBlendFunc и отключена. Спасибо. – user1691399

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

  • Нет связанных вопросов^_^