тесселяция сферы с использованием треугольников разных цветов - PullRequest
1 голос
/ 13 декабря 2011

Я пишу функцию для генерации сферы, используя треугольники для ее тесселяции, но я хочу, чтобы все треугольники имели разные цвета.Однако, когда я запускаю код, он создает сферу, но цвета варьируются от светло-синего до черного без зеленого или красного, и цвета повторяются, а это не то, чего я хочу.

Вот фрагмент кода.Весь код может создать сферу, но это окраска, на которой я действительно застрял.

triangles - это vector<vector<Vertex3>>, который содержит набор всех вершин треугольника, составляющих эту сферу.

enter image description here

glBegin(GL_TRIANGLES);
int red = 0;
int green = 0;
int blue = 0;
for( int j = 0; j< triangles.size(); j++  )
{
    if(red < 200)
        red++;
    else if (blue < 200)
        green++;
    else blue++;
    glColor3ub(red, green, blue);
    //normalize the triangles first
    triangles[j][0].normalize();
    triangles[j][2].normalize();
    triangles[j][2].normalize();

    //call to draw vertices
    glVertex3f( (GLfloat)triangles[j][0].getX(),(GLfloat)triangles[j][0].getY(),
        (GLfloat)triangles[j][0].getZ());
    glVertex3f( (GLfloat)triangles[j][3].getX(),(GLfloat)triangles[j][4].getY(),
        (GLfloat)triangles[j][5].getZ());
    glVertex3f( (GLfloat)triangles[j][2].getX(),(GLfloat)triangles[j][2].getY(),
        (GLfloat)triangles[j][2].getZ());
}
glEnd();

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Вместо glColor3ub(red, green, blue), попробуйте использовать glColor3ub( rand()%255, rand()%255, rand()%255 ).

Использование:

glBegin(GL_TRIANGLES);
for( int j = 0; j< triangles.size(); j++  )
{
    glColor3ub( rand()%255, rand()%255, rand()%255 );
    //normalize the triangles first
    triangles[j][0].normalize();
    triangles[j][1].normalize();
    triangles[j][2].normalize();

    //call to draw vertices
    glVertex3f( (GLfloat)triangles[j][0].getX(),(GLfloat)triangles[j][0].getY(),
        (GLfloat)triangles[j][0].getZ());
    glVertex3f( (GLfloat)triangles[j][1].getX(),(GLfloat)triangles[j][1].getY(),
        (GLfloat)triangles[j][1].getZ());
    glVertex3f( (GLfloat)triangles[j][2].getX(),(GLfloat)triangles[j][2].getY(),
        (GLfloat)triangles[j][2].getZ());
}
glEnd();

РЕДАКТИРОВАТЬ: Создание, хранение и визуализация:

#include <GL/glut.h>
#include <vector>

using namespace std;

struct Vertex
{
    Vertex( bool random = false )
    {
        x = y = z = 0;
        r = g = b = a = 0;
        if( random )
        {
            x = rand() % 20 - 10;
            y = rand() % 20 - 10;
            z = rand() % 20 - 10;
            r = rand() % 255;
            g = rand() % 255;
            b = rand() % 255;
            a = 1;
        }
    }

    float x, y, z;
    unsigned char r, g, b, a;
};

vector< Vertex > verts;
void init()
{
    // fill verts array with random vertices
    for( size_t i = 0; i < 100; ++i )
    {
        verts.push_back( Vertex(true) );
        verts.push_back( Vertex(true) );
        verts.push_back( Vertex(true) );
    }
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-10, 10, -10, 10, -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    // enable vertex and color arrays
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);

    // set vertex and color pointers
    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &verts[0].x );
    glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex), &verts[0].r );

    // draw verts array
    glDrawArrays(GL_TRIANGLES, 0, verts.size() );

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);

    glFlush();
    glutSwapBuffers();
}

void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);

    glutInitWindowSize(800,600);
    glutCreateWindow("Demo");

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);

    init();
    glutMainLoop();
    return 0;
}
0 голосов
/ 13 декабря 2011

Я бы ожидал, что цвета изменятся с черного на красный от медного до желтого до серого до синего серого в зависимости от того, как настроен оператор if (при условии, что у вас есть по крайней мере 600 треугольников.) Сколько трис вы рендерите? Кроме того, в зависимости от того, как настроены ваши другие шейдеры, текстуры могут мешать, как и все остальное, если ваш формат вершин не соответствует. Также не уверен, как glColor3ub () реагирует, когда синее поле становится выше 255, что довольно быстро будет в приведенном выше коде. Если он усекает биты, то вы увидите, что цвета повторяются от желтого до серо-голубого через каждые 256 треугольников после первых 400 .

...