我是一名OpenGL新手。我正在尝试创建一个粒子系统,我已经完成了所有设置,但是粒子跟踪。
我认为,对我来说,最简单的方法就是用几乎透明的颜色清除屏幕,例如alpha = 0.05。这将淡化以前绘制的位置。
然而,这不起作用。我还尝试在屏幕上画一个矩形。
将我的粒子的alpha设置为0.3后,我的透明度似乎不起作用。
这是我的代码:
do{
glBindVertexArray(VertexArrayID);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
time = (float)glfwGetTime();
// ** Calculating new positions and placing into vertex array
iter = 0;
for(int i = 0; i < n; i++){
bodies[i].F(bodies, i, n, 1);
bodies[i].calcPosition(dt);
bodies[i].getVertexArray(vertexArray, iter, scale, i);
}
for(int i = 0; i < n; i++){
bodies[i].F(bodies, i, n, 2);
bodies[i].calcVelocity(dt);
}
// **
glBufferData(GL_ARRAY_BUFFER, 21 * 6 * n * sizeof(float), vertexArray, GL_STREAM_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 20 * 3 * n * sizeof(GLuint), elements, GL_STREAM_DRAW);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(
0,
2,
GL_FLOAT,
GL_FALSE,
6*sizeof(float),
(void*)0
);
glEnableVertexAttribArray(1);
glVertexAttribPointer(
1,
4,
GL_FLOAT,
GL_FALSE,
6*sizeof(float),
(void*)(2*sizeof(float))
);
glDrawElements(GL_TRIANGLES, 20 * 3 * n, GL_UNSIGNED_INT, 0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glfwSwapBuffers();
while((float)glfwGetTime() - time < dt){
}
} // Check if the ESC key was pressed or the window was closed
while( glfwGetKey( GLFW_KEY_ESC ) != GLFW_PRESS &&
glfwGetWindowParam( GLFW_OPENED ) );
我的着色器:
#version 330 core
in vec4 Color;
out vec4 outColor;
void main()
{
outColor = Color;
}
#version 330 core
layout(location = 0) in vec2 position;
layout(location = 1) in vec4 color;
out vec4 Color;
void main(){
gl_Position = vec4(position, 0.0, 1.0);
Color = color;
}
这将输出以不同颜色围绕屏幕行进的n个圆圈(20个边多边形)。所有以前的图纸都留在屏幕上,我希望它们褪色
由于 安迪
答案 0 :(得分:1)
我认为,对我来说,最简单的方法就是用几乎透明的颜色清除屏幕,例如alpha = 0.05。这将淡化以前绘制的位置。
这不会在双缓冲窗口中起作用(并且你不想要一个缓冲的窗口)。在SwapBuffer
之后,后台缓冲区的内容为 undefined 。如果你真的非常幸运,你可能会获得一些较旧的图像内容(但不是最后一个,因为这是前缓冲区)。
要解决此问题,您必须渲染到纹理,这样您可以重绘以前的内容(使用淡出),添加新的粒子位置(仍然渲染到下一帧的纹理中),最后渲染或blit纹理到真正的帧缓冲区。所以你需要至少两个额外的纹理乒乓球。