使用不同颜色的三角形镶嵌球体

时间:2011-12-12 21:35:33

标签: c opengl geometry tesselation

我正在编写一个函数来生成一个使用三角形来镶嵌它的球体,但我想要的是三角形都有不同的颜色。然而,当我运行代码时,它会创建一个球体,但颜色范围从浅蓝色到黑色,根本没有绿色或红色,颜色重复,这不是我想要的。

以下是代码的一部分。整个代码可以产生一个球体,但它是我真正坚持的着色。

trianglesvector<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 个答案:

答案 0 :(得分:1)

而不是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;
}

答案 1 :(得分:0)

我希望颜色从黑色到中红色到中间黄色到灰色再到蓝灰色与if语句的设置方式(假设你至少有600个三角形。)你渲染了多少个tris?此外,根据您的其他着色器的设置方式,如果您的顶点格式不匹配,纹理可能会受到阻碍。 还不确定当蓝色区域超过255时glColor3ub()会如何反应,这将在上面的代码中相当快。如果它截断这些位,那么在第一次400 之后,你会看到每256个三角形的颜色从黄色重复为蓝灰色。