OpenGL-快速精灵绘制-需要一些指导
OpenGL - Fast Sprite Drawing - need some guidance
我的程序使用OpenGL创建并绘制粒子系统。我已经完全使用了glBegin()和glEnd(),但后来我注意到这已经过时了,根本不应该使用。所以我开始用glDrawArrays()重写它;
我看到的是这样的:
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);
这样它就不会显示任何内容(黑屏)。我一个人想不出我需要做什么。
我真正想知道的:
我错过了什么?或者换句话说:如何使用精灵,使用最新的OpenGl绘制大量始终处于运动中的粒子?
要使用哪个OpenGL版本?
OGL 2.0ES、2.1、3.0及更高版本有一些细微的差异,但你基本上需要一个着色器,并减少数据的更改/上传,对于粒子系统来说,这些动态可以在着色器端处理,这样你就不会用不必要的流量消耗总线。
相关文章:
- OpenGL 着色器不绘制任何东西 - 糟糕的精灵类
- 绘制精灵会导致分割错误
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- 为什么该代码不绘制精灵C++ SFML
- 仅使用精灵绘制
- 在绘制循环中绘制精灵
- OpenGL精灵绘制质量低
- OpenGL-快速精灵绘制-需要一些指导
- 如何在cocos2d-x3测试版中围绕精灵绘制边界框
- 尝试绘制精灵地图时出现 SFML 错误
- C++SFML精灵没有绘制,但是没有出现错误
- 未在指定位置绘制的精灵
- 在 cocos2d-x v3 中绘制并向场景添加大量精灵(~200)的最佳方法是什么?
- 无法从 Direct2D png 使用 DirectX9 绘制图像精灵
- OpenGL没有绘制我的纹理精灵
- 精灵批次只绘制第一个精灵
- 使用 directX 10 绘制大型精灵时性能低下
- SFML在另一个类中绘制移动精灵
- c++ SFML精灵不能通过类绘制
- SFML只绘制一些精灵