2014-12-30 2 views
0

Я пытаюсь сделать изображение, рисуя его пиксель для пикселя (да, я знаю, что это не самый эффективный, но его больше для учебных целей), и я получил странную проблему, что он рисует белый линии, как это: the renderingпиксели рендеринга opengl дают белые линии

Я использую перенасыщение и Visual Studio 2013. Это мой glutinit:

glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_ALPHA); // Double buffering, RGB format 
glutInitWindowSize(width, heigth); 
glutInitWindowPosition(0, 0); 
glutCreateWindow("Test Plaatje"); 
glClearColor(1.0, 1.0, 1.0, 1.0); 

glColor3f(1.0, 1.0, 1.0); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluOrtho2D(0.0, 1024, 0.0, 500); 
glMatrixMode(GL_MODELVIEW); 

и это мой рендеринг кода с объяснены некоторые переменные:

... 
std::vector<std::vector<RGB>> _map = std::vector<std::vector<RGB>>(); 
... 
struct RGB 
{ 
    int R; 
    int G; 
    int B; 
}; 
... 

void Map::draw() 
{ 
    glBegin(GL_POINTS); 

    for (float x = 0; x < _w; x++) 
    { 
     for (float y = 0; y < _h; y++) 
     { 
      RGB pixel = _map[y][x]; 
      glColor3ub(pixel.R, pixel.G, pixel.B); 
      glVertex2f(_p[0] + x, _p[1] + y); 
     } 
    } 

    glEnd(); 
} 

Я уже пробовал смещать пиксели с некоторым десятичным значением, но это не сработало. Я проверил, что _map верен, сбросив значения пикселей в файл. для справки это то, что он должен оказывать:

the source

Я понятия не имею, как это исправить. у кого есть идеи?

+1

Попробуйте следующее: 'glHint (GL_POINT_SMOOTH_HINT, GL_NICEST);' Вы, вероятно, хотите заранее включить смешение: 'glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable (GL_POINT_SMOOTH); 'но я не уверен, какие из них необходимы, а какие нет. Также попробуйте увеличить размер точки 'glPointSize (2.0)'. –

+0

@ н.м. Я использовал glEnable (GL_BLEND); glEnable (GL_POINT_SMOOTH); glHint (GL_POINT_SMOOTH_HINT, GL_NICEST); и это сработало! Спасибо! – WillieWonka

+1

Предполагая, что и ваше окно, и ваше изображение имеют ровно 1024x500 пикселей (и матрица вида модели оставлена ​​при идентификации), ваш код должен работать, если '_p [0]' и '_p [1]' установлены равными 0,5, без необходимости использовать ' GL_POINT_SMOOTH'. – derhass

ответ

0

на n.m. tip i добавил glEnable (GL_BLEND); glEnable (GL_POINT_SMOOTH); glHint (GL_POINT_SMOOTH_HINT, GL_NICEST); в конце моего init, и это сработало!

+0

С @ н.м. совет работал, я думаю, что лучше дать ему/ей сообщение в качестве ответа и принять его :) –

+0

@ AdriC.S. я буду, когда он это сделает. я просто подумал, что было бы неплохо, если бы ответ уже был ясен. – WillieWonka

+0

@ AdriC.S. Кредит связан с тем, кто отправил проверенный ответ.Я не был уверен, какая именно конфигурация будет работать, и я все еще не уверен, что эта конфигурация оптимальна. –

0

Вы можете решить эту ошибку с плавающей запятой во многих отношениях:

  • использование glPointSize (2.0)
  • использование смеси и точка гладкой
  • сдвиг вершины Coords проекта в пикселах центрах + .5, + 0,5
  • использование glRect вместо начать/вершина/конец

Personalny я бы preffer вершина сдвига. Но если вы планируете увеличить изображение, лучшим подходом является glRect.

Если вы ищете более серьезное решение, вам следует рассмотреть возможность добавления ваших пикселей в текстуру и рисования с помощью одного квадранта. Также рассмотрите использование glDrawPixels.