粒子跟踪OpenGL 3.3,glClear?

时间:2013-11-02 21:01:20

标签: transparency shader alpha opengl-3 particles

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

由于 安迪

1 个答案:

答案 0 :(得分:1)

  

我认为,对我来说,最简单的方法就是用几乎透明的颜色清除屏幕,例如alpha = 0.05。这将淡化以前绘制的位置。

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

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