1

我是 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 个边的多边形)以不同的颜色在屏幕上移动。所有以前的图纸都留在屏幕上,我希望它们褪色

谢谢安迪

4

1 回答 1

1

我看到的最简单的方法是用几乎透明的颜色清除屏幕,例如 alpha = 0.05。这将淡化先前绘制的位置。

这在双缓冲窗口中不起作用(并且您不想要单个缓冲窗口)。后备缓冲区的内容在之后未定义SwapBuffer。如果你真的非常幸运,你可能会得到一些较旧的图像内容(但不是最后一个,因为这是现在的前端缓冲区)。

要解决此问题,您必须渲染到纹理,因此您可以重绘之前的内容(使用淡出),添加新的粒子位置(仍然渲染到下一帧的纹理中),最后渲染或 blit 该纹理到真正的帧缓冲区。因此,您至少需要两个额外的乒乓式纹理。

于 2013-11-03T13:43:11.973 回答