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 ?
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! –
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