2010-11-14 8 views
1

J'écris un système de particules qui utilise des sprites point dans OpenGL ES 1.1 sur iOS. Tout fonctionne bien jusqu'à ce que j'essaie de texturer les sprites de points ... quand je rends, chaque sprite est coloré par le pixel en haut à gauche de la texture que je charge (plutôt que d'afficher l'image). J'ai essayé différentes images et différentes tailles et toujours obtenir le même résultat.comment spécifier les coordonnées de texture de sprite point dans OpenGL ES 1.1?

code de configuration (pris de l'exemple GLPaint):

CGImageRef  brushImage; 
CGContextRef brushContext; 
size_t   width, height; 
GLubyte   *brushData; 
brushImage = [UIImage imageNamed:@"Particle.png"].CGImage; 
width = CGImageGetWidth(brushImage); 
height = CGImageGetHeight(brushImage); 
if(brushImage) { 
    brushData = (GLubyte *) calloc(width * height * 4, sizeof(GLubyte)); 
    brushContext = CGBitmapContextCreate(brushData, width, width, 8, width * 4, CGImageGetColorSpace(brushImage), kCGImageAlphaPremultipliedLast); 
    CGContextDrawImage(brushContext, CGRectMake(0, 0.0, (CGFloat)width, (CGFloat)height), brushImage); 
    CGContextRelease(brushContext); 
    glGenTextures(1, &brushTexture); 
    glBindTexture(GL_TEXTURE_2D, brushTexture); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, brushData); 
    free(brushData); 
} 

et le rendu du code:

glLoadIdentity(); 
glEnable(GL_BLEND); 

glTranslatef(0.0f,0.0f,0.0f); 
glClearColor(0.0, 0.0, 0.0, 1.0f); 

glClear(GL_COLOR_BUFFER_BIT); 
glEnableClientState(GL_POINT_SPRITE_OES); 
glEnableClientState(GL_POINT_SIZE_ARRAY_OES); 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, brushTexture); 

glTexEnvf(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, GL_TRUE); 

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY);  
// took this out as incorrect call glEnableClientState(GL_POINT_SMOOTH); 

glVertexPointer(2, GL_FLOAT, sizeof(ColoredVertexData2D), &vertexData[0].vertex); 
glColorPointer(4, GL_FLOAT, sizeof(ColoredVertexData2D), &vertexData[0].color); 
glPointSizePointerOES(GL_FLOAT,sizeof(ColoredVertexData2D),&vertexData[0].size) 

glDrawArrays(GL_POINTS, 0,1000); 

quand sprites point de texturation, avez-vous spécifier les coordonnées de texture, et si oui, comment ?

+0

Je pense que GL_POINT_SMOOTH est incompatible avec les sprites point, mais ce n'est pas non plus un drapeau d'état client. Ça vaut le coup d'enlever cette ligne au moins! –

+0

c'est vraiment une aide énorme: quand je change cette ligne en glEnable (GL_POINT_SMOOTH) je reçois des cercles colorés au lieu des carrés colorés ... le supprimer complètement n'a aucun effet: pourrais-je être seulement des points de rendu et pas des sprites? – joshue

Répondre

2

pas de coordonnées doivent être spécifiées, mais vous devez faire des appels corrects pour permettre point sprites:

glEnable (GL_POINT_SPRITE_OES) au lieu de glEnableClientState (GL_POINT_SPRITE_OES) a fait l'affaire.

va faire la différence.

+0

Les coords ne peuvent pas non plus être spécifiés sauf si vous voulez simplement échantillonner une seule couleur de texel. – v01d

Questions connexes