OpenGL не показывает промежуточные цвета

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

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), что желтого цвета.

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]