glDrawArrays дает вертикальные линии при использовании GL_POINTS

Я рисую точки, используя glDrawArrays с GL_POINTS. На моем Intel 82945G Express Chipset Family все работает нормально. Но на ATI Radeon Mobility 5730 вертикальные линии появляются случайным образом при изменении размера окна.

Вот код, который отображает картинку:

glMatrixMode(GL_MODELVIEW);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(color_p_v,GL_FLOAT,offset,color_array);
glDrawArrays(GL_POINTS,0,N);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);

Я опустил здесь инициализацию массива.

Я проверил с помощью gDEBugger, что строки рендерятся в задний буфер после выполнения функции glDrawArrays.

Я видел похожие вопросы здесь, но у людей возникают похожие проблемы при рендеринге текстуры. Мой случай немного проще.

Также есть совет не использовать GL_POINTS, но мне это кажется странным.

Я хочу понять, что происходит под капотом.

ИМХО есть полосная реализация в конкретном драйвере, но что на самом деле происходит?


person zulunation    schedule 12.02.2014    source источник
comment
линии остаются после очистки буфера и повторного рендеринга?   -  person ratchet freak    schedule 12.02.2014
comment
Конечно, нельзя использовать GL_POINTS; с точечными спрайтами они являются эффективным способом выполнения различных забавных операций.   -  person Bartek Banachewicz    schedule 12.02.2014
comment
Включить двойную буферизацию. Вы можете остановить рендеринг во время изменения размера.   -  person adderly    schedule 12.02.2014
comment
Вы не можете рисовать окно во время изменения его размера. Windows перестает запускать обычную помпу сообщений, пока это происходит. Одна хитрость, однако, состоит в том, чтобы запускать таймер с интервалом 0 мс, когда начинается изменение размера, и останавливать таймер, когда он заканчивается. Windows будет продолжать отправлять события таймера при изменении размера окна.   -  person Andon M. Coleman    schedule 12.02.2014
comment
Линии появляются при определенной ширине окна. Когда они появляются, я закрываю окно другими окнами (вызывая сообщение WM_PAINT и перерисовку окна). Линии все еще там.   -  person zulunation    schedule 14.02.2014
comment
Я использую PFD_DOUBLEBUFFER для включения двойной буферизации.   -  person zulunation    schedule 14.02.2014
comment
Я перерисовываю окно при изменении размера, но в таком случае почему линии остаются, когда размер окна не изменяется после изменения размера. Перекраска не помогает   -  person zulunation    schedule 14.02.2014


Ответы (1)


Кажется, я нашел проблему. При указании координат как в float, например (5,6), например, на ATI, я получаю вертикальные линии. При указании (5+0.5f,6+0.5f) все нормально на всех системах. Это связано с тем, как драйвер интерпретирует координаты и положение пикселя. Целочисленные значения координат лежат между пикселями, а не в их центре.

Я хотел бы прочитать больше об этой проблеме, но не смог найти ни одной хорошей статьи по этому поводу.

person zulunation    schedule 09.03.2014
comment
Это не зависит от водителя. Он точно указан (если только вы не укажете OpenGL использовать другое соглашение). Прочтите opengl.org/registry/specs/ARB/fragment_coord_conventions.txt. - person Damon; 09.03.2014