2016-07-08 2 views
1

Я импортирую файлы .obj и .stl с использованием OpenGL и пытаясь покрасить каждую грань. В качестве доказательства концепции, что я могу покрасить объект, я назначил каждой вершине целое число в том порядке, в котором оно было импортировано (1 для первой вершины, 2 для второй вершины, 3 для третьего и т. Д.). Затем я создал функция, которая отображает индекс вершины в значение RGB. Когда я нарисовал все лица, лица имели только несколько разных цветов - и цветных переходов не было. Другими словами, цвета, которые я видел, не плавно переходили - скорее, было несколько определенных цветов с довольно определенными линиями между ними. Это дало мне догадку, что OpenGL может не показывать цвета, как я их хочу, поэтому я установил все вершины всех лиц в оранжевый в моем методе createVertexArray, который инициализирует glBufferData. На выходе была показана желтая модель вместо оранжевого. Что может быть причиной этого?OpenGL не показывает промежуточные цвета

RGB 255,162,0 оранжевый

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

часть основных, где я делаю рисунок:

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 может зажимать эти значения цвета с плавающей запятой до диапазона '[0.0-1.0]' перед их рисованием. Таким образом, RGB (255, 162, 0) -> RGBF (1.0, 1.0, 0.0) == RGB (255, 255, 0), который является желтым. Измените в [mcve], который показывает 'drawGeometry()' и как вы настраиваете вершинный макет, чтобы мы могли точно сказать. – genpfault

+0

genpfault правильный. Поскольку вы используете чередующиеся массивы float, цвета должны быть от 0,0 до 1,0 фракций, а не от байтов. R> = 1,0, G> = 1,0, B = 0 - желтый. –

+0

@genpfault ты был прав! Приведение значений в два раза и деление на 255 (для проверки) решило проблему. Не уверен, почему я думал, что RGB был составлен на основе (255,255,255,1) в OpenGL. Благодаря! Должен ли я ответить на свой вопрос или позволить вам это сделать? – faeophyta

ответ

3

OpenGL, вероятно, зажимая эти значения цветов с плавающей точкой вниз до диапазона [0.0-1.0] перед их рисованием. Таким образом, RGB (255, 162, 0) -> RGBF (1.0, 1.0, 0.0) == RGB (255, 255, 0), который является желтым.

Использование плавающей точкой цветов в [0,0-1,0] диапазоне или использовать массив GLubyte и GL_UNSIGNED_BYTE для параметра type части (я предполагаю) вашего glColorPointer() вызова.

Смежные вопросы