c++ - OpenGL:如何改变每个顶点的颜色?
问题描述
我正在尝试更改使用以下代码创建的每个三角形的顶点颜色:
这是点结构;这个结构存储了每个顶点的位置数据和颜色数据:
struct Point{
float x;
float y;
float z;
float r;
float g;
float b;
};
这里创建了谢尔宾斯基三角形的主三角形;我创建了一个包含所有顶点数据的向量,然后将数据加载到缓冲区中:
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
向量中:
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);
}
当代码绘制时,我得到以下输出:
我的问题是:如何更改每个顶点的颜色?
比如红色的顶点,把它变成蓝色,绿色的变成红色,蓝色的变成绿色等等,生成一种动画。
编辑
在代码中,设置了颜色,但我真正想要的是每个顶点的颜色随时间而变化。
解决方案
当您想随着时间的推移更改顶点的颜色时,您可能希望逐帧修改它,如以下链接中的示例所示:
我已经建立了一种简单的方法来让这些结构在渲染循环期间改变它们的值;一旦你有了这个想法,你就可以获得[更多]创意。重要的是更新结构中的数据并在每一帧将新数据加载到顶点缓冲区对象中,以便顶点着色器和片段着色器可以读取新值。
请注意,您可以在每一帧中以不同的方式更改颜色;另一个想法可能是使用随机数来设置颜色的组件。
附带说明一下,您应该能够将vertices.data()
toglBufferData
作为指向顶点数据的指针传递,并避免为其声明 s 数组Point
。
推荐阅读
- java - ServletRequestListner 是否适用于邮递员的 REST api 调用?
- javascript - 我创建了一个 aspx 页面,我想在其中检查数据是否存在于 gridview 中或不使用 javascript,但该函数没有被执行
- django - 如何在 django 中注销非活动用户?
- c++ - 我的代码有什么问题?使用 Qt 的原始输入 API
- dronekit-python - Takeoff after Landing using Dronekit
- java - 在运行时使用一些字符串调用方法
- python - python中的ffill作为链式方法和作为参数有什么区别?
- ios - 无法通过 fastlane 在 Crashlytics Beta 发行说明中包含表情符号
- exchangewebservices - 使用 ews soap 请求在线检查用户邮箱中是否存在特定文件夹
- c# - 如何在 umbraco 7.13 中动态地将 CSS 样式添加到 Grid 上的 div?