내 프로그램은 OpenGL을 사용하여 입자 시스템을 만들고 그립니다. 나는 glBegin()과 glEnd()를 사용하여 완벽하게 작업 하였지만, 구식이므로 전혀 사용하지 않아야한다는 것을 알았다. 그래서 glDrawArrays()로 다시 작성하기 시작했습니다.OpenGL - 빠른 스프라이트 그리기 - 일부 지침이 필요합니다.
는 내가 가지고있는 것은 다음과 같습니다
typedef QVector< Particle* > PARTICLES;
#define PARTICLE_SIZE 20.0f
void GLWidget::initializeGL()
{
//>> TEST
QGLFormat glFormat(QGL::SampleBuffers);
glFormat.setSwapInterval(1); // vsync
//>> /TEST
QImage textureSnow = QGLWidget::convertToGLFormat(imgSnow);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glGenTextures(3, m_texture);
//Snow Particles
glBindTexture(GL_TEXTURE_2D, m_texture[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
textureSnow.width(), textureSnow.height(),
0, GL_RGBA, GL_UNSIGNED_BYTE, textureSnow.bits());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFinish();
m_renderTimer->start(0);
}
void GLWidget::paintGL()
{
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, m_texture[1]);
glEnable(GL_TEXTURE_2D);
glLoadIdentity();
PARTICLES particles = m_particleSystem->getParticles();
for(int i = 0; i < m_particleSystem->getParticleCount(); i++)
{
// Get specific variables for the Particle
float x = particles[i]->getX();
float y = particles[i]->getY();
float scale = particles[i]->getScale();
float correctionValue = (PARTICLE_SIZE*scale/2);
const float verts[] = {
x -correctionValue, y -correctionValue,
x +PARTICLE_SIZE -correctionValue, y -correctionValue,
x +PARTICLE_SIZE -correctionValue, y + PARTICLE_SIZE -correctionValue,
x -correctionValue, y +PARTICLE_SIZE -correctionValue
};
// Since I don't use more than one sprite for this Particle at the moment
const float texVerts[] = {
0.0f, 0.0f,
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 1.0f
};
glVertexPointer(2, GL_FLOAT, 0, verts);
glTexCoordPointer(2, GL_FLOAT, 0, texVerts);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
}
glBindTexture(GL_TEXTURE_2D, 0);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
는 아무것도 (검은 화면)이 표시되지 않습니다 이쪽으로. 나는 내가해야 할 일을 혼자 생각할 수 없다.
나는 무엇을 그리워 않은 : 나는 실제로 알고 싶은 무엇
? 즉, Sprite를 사용하여 항상 최신 OpenGl로 대량의 입자를 그리는 방법은 무엇입니까?
버텍스 데이터를 버텍스 버퍼 객체 또는 버텍스 배열 객체를 통해 렌더링하기 전에 GPU에 버텍스 데이터를 제출 한 다음 셰이더로 버텍스를 렌더링해야합니다. [이 튜토리얼은 현대 OpenGL을 가르치는 좋은 일을한다] (http://open.gl/drawing) – rcapote
이 튜토리얼을 살펴볼 것이다. 답장을 보내 주셔서 감사합니다. – Dunkelbunt27