【问题标题】:Particle trails OpenGL 3.3, glClear?粒子轨迹OpenGL 3.3,glClear?
【发布时间】:2013-11-02 21:01:20
【问题描述】:

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

谢谢 安迪

【问题讨论】:

    标签: transparency shader alpha opengl-3 particles


    【解决方案1】:

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

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

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

    【讨论】:

    • 所以 glClear() 不起作用。应该用 alpha = 0.05 绘制一个屏幕大小的矩形吗?感谢您再次帮助我... :)
    • @AndrewSeymour:不是真的。它将在单缓冲上下文中工作。在这种情况下,您直接绘制到可见的帧缓冲区(这通常是要避免的,因为它a)会导致闪烁,因为由于显示器的刷新可能会在两者之间的任何时间发生过度绘制的对象对于帧可能是可见的,并且b) 输出通常与显示器不同步,因此您会看到撕裂,并且同步到 vblank 将不起作用。)在您的特定用例中,您可能甚至可以侥幸逃脱。但这绝不能保证。
    猜你喜欢
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    相关资源
    最近更新 更多