2010-11-14 113 views
1

我正在編寫一個在iOS上使用OpenGL ES 1.1中的點精靈的粒子系統。一切都很好,直到我嘗試紋理點精靈爲止......當我渲染時,每個精靈都被我加載的紋理的左上角像素着色(而不是顯示圖像)。我試過不同的圖像和不同的尺寸,並始終得到相同的結果。如何在OpenGL ES 1.1中指定點精靈紋理座標?

設置代碼(從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); 
} 

和渲染代碼:

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); 

當紋理點精靈,你必須指定紋理座標,如果是這樣,怎麼樣?

+0

我認爲GL_POINT_SMOOTH與點精靈不兼容,但它不是客戶端狀態標誌。至少值得去掉那條線! – 2010-11-14 23:58:30

+0

這實際上是一個巨大的幫助:當我將該行更改爲glEnable(GL_POINT_SMOOTH)時,我得到彩色圓圈而不是彩色方塊...完全刪除它沒有任何影響:我可以只渲染點而不是點精靈嗎? – joshue 2010-11-15 00:36:28

回答

2

沒有座標需要指定的,但你必須做出正確的調用,使點組圖:

glEnable(GL_POINT_SPRITE_OES),而不是glEnableClientState(GL_POINT_SPRITE_OES)的伎倆。

要去分化的差異。

+0

除非您只是想要採樣單個紋理顏色,否則也不能指定座標。 – v01d 2010-11-15 05:51:31