저는 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 양면 다각형)를 출력
이 내 코드입니다. 날이 거의 투명 색상 등으로 화면을 취소하는 것입니다 구현하기 위해 이전의 모든 도면, 나는 내가 보는 것을, 그들이
감사 앤디
그래서 glClear()가 작동하지 않습니다. 알파 = 0.05로 화면의 사각형을 그려야합니까? 도와 줘서 고마워. 다시. :) –
@ AndrewSeymour :별로. 싱글 버퍼링 컨텍스트에서 작동합니다. 그러한 시나리오에서는 표시되는 프레임 버퍼에 직접 그릴 수 있습니다 (대개 a를 사용하면 피할 수 있음). 오버레이 된 객체가 화면의 새로 고침으로 인해 프레임에 표시 될 수 있기 때문에 깜박임이 발생할 수 있습니다. b) 출력은 일반적으로 디스플레이와 비 동기화되어 있으므로 찢어지는 현상이 나타나고 vblank에 동기화되지 않습니다.) 특정 사용 사례에서는 사용자가 멀리 떨어져있을 수도 있습니다. 그러나 그것은 결코 보장 될 수있는 것이 아닙니다. – derhass