2016-07-08 1 views
1

J'importe les fichiers .obj et .stl en utilisant OpenGL et en essayant de colorier chaque face. Comme preuve de concept que je peux colorier l'objet, j'ai assigné chaque sommet un entier dans l'ordre où il a été importé (1 pour le premier sommet, 2 pour le deuxième sommet, 3 pour le troisième et etc.) Ensuite, j'ai créé un fonction qui mappe l'index du vertex à une valeur RGB. Quand j'ai dessiné tous les visages, les visages n'avaient que quelques couleurs différentes - et il n'y avait pas de transition de couleur. En d'autres termes, les couleurs que j'ai vues ne se sont pas déroulées sans heurt - plutôt, il y avait quelques couleurs définies avec des lignes assez définies entre les deux. Cela m'a donné l'intuition qu'OpenGL n'affichait peut-être pas les couleurs comme je le souhaitais, donc j'ai mis tous les sommets de tous les visages à l'orange dans ma méthode createVertexArray - qui initialise le glBufferData. La sortie a montré le modèle jaune au lieu d'orange. Qu'est-ce qui peut causer cela?OpenGL ne montre pas les couleurs intermédiaires

RGB 255,162,0 est orange

createVertexArray:

void createVertexArray(std::vector<triangle> & facet, std::map<vec3d, GLfloat> & vecMagMap, float* vertices, std::vector<GLfloat> mags, GLfloat j_min, GLfloat j_max) 
{ 
    const int NUM_FACETS = facet.size(); 
    std::cout << "\nNUMFACETS: " << NUM_FACETS << "\n"; 
    int count = 0; 
    hsv temp; 
    rgb tempRGB; 
    int tempH = 0; 
    for (int facet_index = 0; facet_index < NUM_FACETS; facet_index++){ 
     tempRGB = getColor(vecMagMap[facet[facet_index].point[0]], 0, vecMagMap.size()); 
     temp = rgb2hsv(tempRGB); 
     //if (tempH != temp.h){ std::cout << tempH << "\n"; tempH = temp.h; } 
      vertices[count + 0] = facet[facet_index].point[0].x; 
      vertices[count + 1] = facet[facet_index].point[0].y; 
      vertices[count + 2] = facet[facet_index].point[0].z; 
      vertices[count + 3] = facet[facet_index].normal.x; 
      vertices[count + 4] = facet[facet_index].normal.y; 
      vertices[count + 5] = facet[facet_index].normal.z; 
      vertices[count + 6] = 255; 
      vertices[count + 7] = 162; 
      vertices[count + 8] = 0; 
      vertices[count + 9] = 1.0; 
      vertices[count + 10] = facet[facet_index].point[1].x; 
      vertices[count + 11] = facet[facet_index].point[1].y; 
      vertices[count + 12] = facet[facet_index].point[1].z; 
      vertices[count + 13] = facet[facet_index].normal.x; 
      vertices[count + 14] = facet[facet_index].normal.y; 
      vertices[count + 15] = facet[facet_index].normal.z; 
      vertices[count + 16] = 255; 
      vertices[count + 17] = 162; 
      vertices[count + 18] = 0; 
      vertices[count + 19] = 1.0; 
      vertices[count + 20] = facet[facet_index].point[2].x; 
      vertices[count + 21] = facet[facet_index].point[2].y; 
      vertices[count + 22] = facet[facet_index].point[2].z; 
      vertices[count + 23] = facet[facet_index].normal.x; 
      vertices[count + 24] = facet[facet_index].normal.y; 
      vertices[count + 25] = facet[facet_index].normal.z; 
      vertices[count + 26] = 255; 
      vertices[count + 27] = 162; 
      vertices[count + 28] = 0; 
      vertices[count + 29] = 1.0; 
      count += 30; 
    } 
} 

partie de principale où je fais le dessin:

glGenBuffers(1, &bufferID); 
glBindBuffer(GL_ARRAY_BUFFER, bufferID); 
glBufferData(GL_ARRAY_BUFFER,facet.size()*30*sizeof(GLfloat),vertices,GL_STATIC_DRAW); 
    glPolygonMode(GL_FRONT, // options: GL_FRONT, GL_BACK, GL_FRONT_AND_BACK 
       GL_FILL); // options: GL_POINT, GL_LINE, GL_FILL (default) 
    glShadeModel(GL_SMOOTH); // shading model 
    scale = 5.0*scale_0;  // initial scale 
    delta = 0.010*scale_0; // change in scale 
    int frame = 0; 
    while(running){ 
     drawGeometry(argv, window, scale, frame,vertices, 3*facet.size(),move_x, move_y, move_z,rotate_x, rotate_y, rotate_z);// render objects in the window 
     if(!pause){rotate_x += drot_x;rotate_y += drot_y;rotate_z += drot_z;} 
     glfwSwapBuffers(window);// swap front and back buffers 
     glfwPollEvents();// poll for and processs events 
    } 
+1

OpenGL pourrait bloquer ces valeurs de couleur à virgule flottante jusqu'à la plage '[0.0-1.0]' avant de les dessiner. Donc RGB (255, 162, 0) -> RGBF (1.0, 1.0, 0.0) == RGB (255, 255, 0), qui est jaune. Éditez dans un [mcve] qui montre 'drawGeometry()' et comment vous configurez votre disposition de vertex afin que nous puissions le dire avec certitude. – genpfault

+0

genpfault est correct. Parce que vous utilisez des tableaux entrelacés de float, les couleurs doivent être de 0,0 à 1,0 fractions, pas des octets. R> = 1,0, G> = 1,0, B = 0 est jaune. –

+0

@genpfault vous aviez raison! Faire doubler les valeurs et diviser par 255 (pour tester) a résolu le problème. Je ne sais pas pourquoi je pensais que RGB a été tiré basé sur (255,255,255,1) dans OpenGL. Merci! Devrais-je répondre à ma propre question ou vous laisser faire? – faeophyta

Répondre

3

OpenGL est probablement serrage les valeurs de couleur en virgule flottante vers le bas à la plage [0.0-1.0] avant de les dessiner. Donc RGB (255, 162, 0) -> RGBF (1.0, 1.0, 0.0) == RGB (255, 255, 0), qui est jaune.

Utilisez des couleurs à virgule flottante dans la [0,0-1,0] ou vont utiliser un tableau de GLubyte et GL_UNSIGNED_BYTE pour le paramètre de type (je suppose) votre appel glColorPointer().