2016-07-08 23 views
1

Ich importiere .obj und .stl Dateien mit OpenGL und versuche jedes Gesicht zu färben. Als Beweis dafür, dass ich das Objekt färben kann, habe ich jedem Eckpunkt eine ganze Zahl in der Reihenfolge gegeben, in der er importiert wurde (1 für den ersten Eckpunkt, 2 für den zweiten Eckpunkt, 3 für den dritten usw.) Funktion, die den Index des Scheitelpunkts einem RGB-Wert zuordnet. Wenn ich alle Gesichter zeichnete, hatten die Gesichter nur ein paar verschiedene Farben - und es gab keine Farbübergänge. Mit anderen Worten, die Farben, die ich gesehen habe, sind nicht glatt übergegangen - vielmehr gab es ein paar definierte Farben mit ziemlich definierten Linien dazwischen. Das gab mir den Eindruck, dass OpenGL nicht die Farben anzeigt, wie ich sie will, also setze ich alle Scheitelpunkte aller Flächen in meiner createVertexArray Methode auf orange - was die glBufferData initialisiert. Die Ausgabe zeigte das Modell gelb statt orange. Was könnte das verursachen?OpenGL zeigt keine Zwischenfarben an

RGB 255,162,0 ist 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; 
    } 
} 

Teil des Haupt wo ich die Zeichnung:

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 kann diese Gleitkomma-Farbwerte vor dem Zeichnen auf den Bereich "[0.0-1.0]" herunterziehen. Also RGB (255, 162, 0) -> RGBF (1.0, 1.0, 0.0) == RGB (255, 255, 0), was gelb ist. Editiere in einem [mcve], das 'drawGeometry()' zeigt und wie du dein Vertex-Layout einrichtest, damit wir es mit Sicherheit sagen können. – genpfault

+0

genpfault ist korrekt. Da Sie verschachtelte Float-Arrays verwenden, müssen die Farben 0.0 bis 1.0 Brüche sein, nicht Bytes. R> = 1,0, G> = 1,0, B = 0 ist gelb. –

+0

@genpfault Sie hatten Recht! Wenn Sie die Werte verdoppeln und durch 255 dividieren (zum Testen), wurde das Problem gelöst. Ich bin mir nicht sicher, warum ich dachte, dass RGB basierend auf (255,255,255,1) in OpenGL gezeichnet wurde. Vielen Dank! Soll ich meine eigene Frage beantworten oder lassen Sie es tun? – faeophyta

Antwort

3

OpenGL wahrscheinlich klemmt diese Gleitkommaoperationen Farbwerte nach unten in den Bereich [0.0-1.0] vor dem Zeichnen. Also RGB (255, 162, 0) -> RGBF (1.0, 1.0, 0.0) == RGB (255, 255, 0), was gelb ist.

Verwendung Gleitkommazahlen Farben in dem [0,0-1,0] Bereich oder ein Array von GLubyte und GL_UNSIGNED_BYTE für die type Parameter verwenden (Ich nehme) Ihren glColorPointer() Anruf.