Лучшие точки перекрытия в OpenGL - PullRequest
0 голосов
/ 09 мая 2018

Я использую этот метод для имитации контура точки.

GLfloat points[graph->vertexCount * 6];
GLfloat outlinePoints[graph->vertexCount * 6];

for (int i = 0 ; i < graph->vertexCount; i++) 
{
    outlinePoints[i*6] = (graph->vertices[i].x / (backingWidth/2) ) - 1;
    outlinePoints[i*6+1] = -(graph->vertices[i].y / (backingHeight/2) ) + 1;
    outlinePoints[i*6+2] = 0.9;
    outlinePoints[i*6+3] = 0.9;
    outlinePoints[i*6+4] = 0.9;
    outlinePoints[i*6+5] = 1.0;

    points[i*6] = (graph->vertices[i].x / (backingWidth/2) ) - 1;
    points[i*6+1] = -(graph->vertices[i].y / (backingHeight/2) ) + 1;
    points[i*6+2] = 1.0;
    points[i*6+3] = 0.0;
    points[i*6+4] = 0.0;
    points[i*6+5] = 1.0;
}

// for outline points
glEnable(GL_POINT_SMOOTH);
glPointSize(DOT_SIZE*scale*1.2); 
glVertexPointer(2, GL_FLOAT, 24, outlinePoints); 
glColorPointer(4, GL_FLOAT, 24, &outlinePoints[2]);
glDrawArrays(GL_POINTS, 0, graph->vertexCount);

// for red points
glEnable(GL_POINT_SMOOTH);
glPointSize(DOT_SIZE*scale); 
glVertexPointer(2, GL_FLOAT, 24, points);
glColorPointer(4, GL_FLOAT, 24, &points[2]);
glDrawArrays(GL_POINTS, 0, graph->vertexCount);

Точки отображаются так, как я хочу, когда нет перекрытия.

enter image description here

Но когда одна точка перекрывает другую точку, белый контур перекрывается красной точкой. enter image description here

Я думаю, что причина в том, что все точки контура помещаются в массив и отображаются перед всеми красными точками. Порядок рендеринга должен быть «(белая точка, красная точка), (белая точка, красная точка) ...», что-то вроде белой точки и красной точки сгруппировано.

Должно быть так:

enter image description here

Как я могу это сделать?

------------ Временное решение отредактировано 12 ------------

 for (int i = 0 ; i < graph->vertexCount; i++)
{
    GLfloat points[6];
    GLfloat outlinePoints[6];

    outlinePoints[0] = (graph->vertices[i].x / (backingWidth/2) ) - 1;
    outlinePoints[1] = -(graph->vertices[i].y / (backingHeight/2) ) + 1;
    outlinePoints[2] = 0.9;
    outlinePoints[3] = 0.9;
    outlinePoints[4] = 0.9;
    outlinePoints[5] = 1.0;

    glPointSize(DOT_SIZE*scale*1.3); 
    glVertexPointer(2, GL_FLOAT, 24, outlinePoints);
    glColorPointer(4, GL_FLOAT, 24, &outlinePoints[2]);
    glDrawArrays(GL_POINTS, 0, 1);

    // red points
    points[0] = (graph->vertices[i].x / (backingWidth/2) ) - 1;
    points[1] = -(graph->vertices[i].y / (backingHeight/2) ) + 1;
    points[2] = 1.0;
    points[3] = 0.0;
    points[4] = 0.0;
    points[5] = 1.0;

    glPointSize(DOT_SIZE*scale);
    glVertexPointer(2, GL_FLOAT, 24, points);
    glColorPointer(4, GL_FLOAT, 24, &points[2]);
    glDrawArrays(GL_POINTS, 0, 1);
}

Приведенный выше код может рисовать точки, как я и ожидал, но следующий код должен выполняться дважды при рисовании каждой точки, просто не знаете, насколько это повлияет на скорость рендеринга, если точки увеличатся?

    glPointSize(DOT_SIZE*scale);
    glVertexPointer(2, GL_FLOAT, 24, points);
    glColorPointer(4, GL_FLOAT, 24, &points[2]);
    glDrawArrays(GL_POINTS, 0, 1);
...