2011-12-12 136 views
1

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

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

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(); 
+0

你介意发布结果的屏幕截图吗?另外,你有纹理活动,任何着色器,任何照明等? – nonVirtualThunk

+0

我没有激活任何。我添加了当前结果的屏幕截图。 – mma1480

回答

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; 
} 
+0

我试过,但由于函数调用是在for循环中,瓷砖不断地改变颜色,这不是我想要的。 – mma1480

+1

因此,当您生成顶点时生成颜色。 – genpfault

+0

生成并存储它们? – mma1480

0

我期望的颜色从黑到红MED到配有黄色到灰色到蓝灰色的方式你的if语句被设置(假设你至少有600个三角形。)你渲染多少个tris?另外,根据你的其他着色器的设置方式,如果你的顶点格式不匹配,纹理可能会阻碍其他任何事情。 也不知道glColor3ub()在蓝色字段高于255时会发生什么反应,它会在上面的代码中很快地出现。如果它截断比特,那么你会看到在第一个400个 之后,每256个三角形的颜色从黄色到蓝色重复。

+0

RE:'unsigned int' - >'unsigned char',[Microsoft claim](http://msdn.microsoft.com/en-us/library/e9s326kw.aspx)低位字节将被保留。在'gcc'中验证4.4.5。 – genpfault

+0

够公平 - 这是一种会接近症状的猜测。感谢您的双重检查。 –

+0

我试过了,但它仍然给出了相同的结果。我认为这个问题是因为for循环。它循环,直到值是在他们的最大值,然后颜色停止改变,但我想颜色留在相同的三角形,但我不完全知道要实现它 – mma1480

相关问题