使用 OpenGL 3+ 渲染点(粒子)
Rendering points (particles) with OpenGL 3+
OpenGL 3 渲染点:点存储在空间分区树中。树具有具有颜色和法线信息属性的点。
点信息及其属性存储为一组缓冲区。
-
偏移缓冲区是一个矢量数组。
-
这些点作为中心和偏移索引存储在内存中。偏移索引指向偏移缓冲区
Point = center + OffSetBuffer[offset index]
。
法线 存储在法线缓冲区中,每个点都保存一个法线缓冲区的索引。
颜色存储在颜色缓冲区中,每个点保存颜色缓冲区的索引。
我有一些空间来更改缓冲区布局,但如上所述保存信息可以减少重复或冗余信息。
我的问题是如何使用OpenGL 3+ API有效地渲染上述要点?
您不需要额外的偏移缓冲区和偏移索引,只需传递纹理坐标即可。以下是您应该在顶点程序中执行的操作:
1) 从模型视图矩阵计算粒子基:
vec3 X = vec3(ModelView[0][0], ModelView[1][0], ModelView[2][0]);
vec3 Y = vec3(ModelView[0][1], ModelView[1][1], ModelView[2][1]);
2)根据粒径计算角点(可以是均匀的或属性的):
vec3 A1 = -X*SizeX - Y*SizeY;
vec3 B1 = X*SizeX - Y*SizeY;
vec3 C1 = X*SizeX + Y*SizeY;
vec3 D1 = -X*SizeX + Y*SizeY;
3) 将中心点移动到适当的角落:
if (TexCoord == vec2(0.0, 0.0)) Position += A1;
if (TexCoord == vec2(1.0, 0.0)) Position += B1;
if (TexCoord == vec2(1.0, 1.0)) Position += C1;
if (TexCoord == vec2(0.0, 1.0)) Position += D1;
或更高效的无分支代码:
vec3 O1 = ( 1.0 - TexCoord.y ) * ( A1 * ( 1.0 - TexCoord.x ) + B1 * TexCoord.x );
vec3 O2 = TexCoord.y * ( C1 * TexCoord.x + D1 * (1.0 - TexCoord.x ) );
Position += O1 + O2;
相关文章:
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGl glm rotate
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- OpenGL在启用深度测试时不会丢弃我的碎片
- OpenGL相机和相机空间转型的困惑
- OpenGL将纹理四边形渲染为(0,0)
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 发布旋转矩阵(openGL/glm)
- OPENGL c++ 动画粒子
- 使用 OpenGL 3+ 渲染点(粒子)
- 使用 OpenGL C++中的粒子
- OpenGL + 优化绘图粒子对象以进行布料模拟
- OpenGL C++中的粒子闪烁
- openGL粒子效应的解释
- OpenGL中粒子发射器的简单三维烟雾算法
- 为什么 OpenGL 不显示我的火粒子