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
}
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
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. –
@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