2013-11-02 4 views
1

저는 OpenGL 초보자입니다. 저는 입자 시스템을 만들려고 노력하고 있습니다. 모든 것이 준비되었지만, 입자는 뒤 쫒아 왔습니다.입자 산책로 OpenGL 3.3, glClear?

내가보기에 가장 쉬운 방법은 거의 투명한 색 (예 : alpha = 0.05)으로 화면을 지우는 것입니다. 이렇게하면 이전에 그려진 위치가 사라집니다.

그러나 이것은 작동하지 않습니다. 나는 또한 화면 위에 사각형을 그리려고했다.

내 입자의 알파를 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.05. 이렇게하면 이전에 그려진 위치가 사라집니다.

이중 버퍼 창에서는 작동하지 않습니다 (버퍼링되지 않은 단일 창을 사용하지 않으려는 경우). 백 버퍼의 내용은 SwapBuffer 뒤에 이 정의되지 않았습니다.입니다. 정말 운이 좋다면 이전 이미지 내용 중 일부를 얻을 수 있습니다 (그러나 지금은 프론트 버퍼이므로 마지막 부분은 아닙니다).

이 문제를 해결하려면 이전 내용을 페이드 아웃으로 다시 그릴 수 있고 새 입자 위치를 추가 한 다음 (다음 프레임의 텍스처로 계속 렌더링 함) 마지막으로 렌더링 할 수 있도록 텍스처를 렌더링해야합니다 또는 그 텍스처를 실제 프레임 버퍼에 blit합니다. 따라서 핑퐁 (ping-pong) 방식으로 최소한 두 개의 추가 텍스처가 필요합니다.

+0

그래서 glClear()가 작동하지 않습니다. 알파 = 0.05로 화면의 사각형을 그려야합니까? 도와 줘서 고마워. 다시. :) –

+1

@ AndrewSeymour :별로. 싱글 버퍼링 컨텍스트에서 작동합니다. 그러한 시나리오에서는 표시되는 프레임 버퍼에 직접 그릴 수 있습니다 (대개 a를 사용하면 피할 수 있음). 오버레이 된 객체가 화면의 새로 고침으로 인해 프레임에 표시 될 수 있기 때문에 깜박임이 발생할 수 있습니다. b) 출력은 일반적으로 디스플레이와 비 동기화되어 있으므로 찢어지는 현상이 나타나고 vblank에 동기화되지 않습니다.) 특정 사용 사례에서는 사용자가 멀리 떨어져있을 수도 있습니다. 그러나 그것은 결코 보장 될 수있는 것이 아닙니다. – derhass