c++ - OpenGL:如何更改每个顶点的颜色?

标签 c++ opengl

我正在尝试更改使用以下代码创建的每个三角形的顶点的颜色:
这是Point结构;该结构存储每个顶点的位置数据和颜色数据:

struct Point{
    float x;
    float y;
    float z;
    float r;
    float g;
    float b;
};
在此创建了Sierpinski三角形的主三角形;我创建了一个包含所有顶点数据的 vector ,然后将数据加载到缓冲区中:
Point A, B, C;
A = {0.0f, 0.9f, 0.0f, 1.0f, 0.0f, 0.0f};
B = {0.9f, -0.9f, 0.0f, 0.0f, 1.0f, 0.0f};
C = {-0.9f, -0.9f, 0.0f, 0.0f, 0.0f, 1.0f};
std::vector<Point> vertices;   
int depth = 6;    
draw_triangles(A, B, C, depth, vertices);
      
Point vertices2[vertices.size()];
for(int i = 0;i<vertices.size();i++){
    vertices2[i] = vertices[i];
}
    
unsigned int VAO, VBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);

glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices2), vertices2, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float)));
glEnableVertexAttribArray(1);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

此函数生成所有顶点数据,并将每个顶点的位置数据存储在vertices vector 中:
void draw_triangles(Point A, Point B, Point C, int depth, std::vector<Point>& vertices){
    if(depth == 0) return;
    
    Point X = {(((B.x + C.x)/2) + B.x)/2, (B.y + A.y)/2, 0.0f, 1.0f, 0.0f, 0.0f};
    Point Y = {(B.x + C.x) / 2, B.y, 0.0f, 0.0f, 1.0f, 0.0f};
    Point Z = Z = {(((B.x + C.x)/2) + C.x)/2, (B.y + A.y)/2, 0.0f, 0.0f, 0.0f, 1.0f};
   
    vertices.push_back(X);
    vertices.push_back(Y);
    vertices.push_back(Z);
    
    depth--; 
    draw_triangles(A, X, Z, depth, vertices);
    draw_triangles(A, X, Z, depth, vertices);
    draw_triangles(X, B, Y, depth, vertices);
    draw_triangles(Z, Y, C, depth, vertices);
}
当代码绘制时,我得到以下输出:
output obtained
我的问题是:如何更改每个顶点的颜色?
例如,将红色顶点更改为蓝色,将绿色顶点更改为红色,将蓝色顶点更改为绿色等等,生成一种动画。
编辑
在代码中,颜色已设置,但是我真正想要的是每个顶点的颜色会随着时间变化。

最佳答案

当您想随着时间改变顶点的颜色时,您可能希望逐帧地对其进行修改,如以下链接中的示例所示:
https://godbolt.org/z/Y1brGx
我已经建立了一种简单的方法,使这些结构在渲染循环中更改其值。有了这个主意,您就可以[获得]更多创意。
重要的是更新结构中的数据,并在每帧将新数据加载到顶点缓冲区对象中,以便顶点着色器和片段着色器可以读取新值。
请注意,您可以在每一帧中以不同的方式改变颜色。另一个想法是使用随机数来设置颜色的分量。
作为附带说明,您应该能够将vertices.data()传递给glBufferData作为指向顶点数据的指针,并且避免为其声明一个Point数组。

关于c++ - OpenGL:如何更改每个顶点的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63094589/

相关文章:

c++ Singleton with map 原因 "violation reading location"

c++ - 如何在其他变量中加入2个变量

c++ - 我如何从我的 maybe<> monad 中获取值(value)?

python - 如何在已经加载的 OpenGL 场景中添加顶点?

c - 用于tilemap的VBO(绘制顺序和倾斜的2D航空)

C++ const 限定符

c++ - 使用std::vector::swap方法在C++中交换两个不同的 vector 是否安全?

c++ - 如何在标准 GUI 应用程序中以 Qt3D 呈现?

macos - NSOpenGLView 重绘速度有多快?它有默认的 FPS 吗?

java - glTranslate/rotate 在我的代码中不起作用