【问题标题】:OpenGL not showing intermediate colorsOpenGL不显示中间颜色
【发布时间】:2016-11-11 11:04:32
【问题描述】:

我正在使用 OpenGL 导入 .obj 和 .stl 文件并尝试为每个面着色。作为我可以为对象着色的概念证明,我按照导入的顺序为每个顶点分配了一个整数(第一个顶点为 1,第二个顶点为 2,第三个顶点为 3,依此类推)接下来,我创建了一个将顶点的索引映射到 RGB 值的函数。当我画完所有的脸时,这些脸只有几种不同的颜色——而且没有颜色过渡。换句话说,我看到的颜色并没有平滑过渡——相反,有一些定义的颜色,它们之间有相当明确的线条。 这让我有一种预感,OpenGL 可能不会按照我想要的方式显示颜色,所以我在我的createVertexArray 方法中将所有面的所有顶点设置为橙色——它初始化了glBufferData。输出显示模型黄色而不是橙色。这可能是什么原因造成的?

RGB 255,162,0 为橙色

创建顶点数组:

 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
     }

【问题讨论】:

  • OpenGL 在绘制它们之前可能会将这些浮点颜色值限制在[0.0-1.0] 范围内。所以 RGB(255, 162, 0) -> RGBF(1.0, 1.0, 0.0) == RGB(255, 255, 0),也就是黄色。编辑 minimal reproducible example,显示 drawGeometry() 以及您如何设置顶点布局,以便我们确定。
  • genpfault 是正确的。因为您使用的是交错的浮点数组,所以颜色必须是 0.0 到 1.0 的分数,而不是字节。 R >= 1.0, G >= 1.0, B = 0 为黄色。
  • @genpfault 你是对的!使值加倍并除以 255(测试)解决了这个问题。不知道为什么我认为 RGB 是基于 OpenGL 中的 (255,255,255,1) 绘制的。谢谢!我应该回答我自己的问题还是让你回答?
  • @HughFisher 谢谢,这解决了我的问题!数小时以来一直试图弄清楚。
  • @Amadeus,原来我在 RGB 中使用了不正确的值,但感谢您的链接 - 它提供了很多信息!

标签: c++ opengl colors shader rgba


【解决方案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] 范围内的浮点颜色或使用 GLubyteGL_UNSIGNED_BYTE 的数组作为(我假设)您的 glColorPointer() 调用的 type 参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多