2012-10-28 16 views
4

最終我試圖使用單個圖像由每個對象提供不同的紋理座標進行紋理多個對象(六邊形)的。
使用的OpenGL ES 2.0和GLKit我想出了這樣只是做的方法來發現,由於某些原因,如果我的malloc的對象不會渲染和手動初始化頂點數組。我特別不明白爲什麼這是因爲頂點數組的靜態賦值版本工作得很好。爲什麼如果手動生成頂點(malloc'd然後初始化),但是如果靜態分配會渲染,我的對象不會渲染?

鋒線這裏是我使用的結構:

typedef struct { 
GLKVector3 position; 
GLKVector4 color; 
GLKVector2 texCoords; 
}Vertex; 

所以,如果我這樣做是一個六角形的實現,我可以看到應用了紋理的各種六邊形:

Vertex _Vertices[] = { 
{{ 0, 0,  0}, {1, 1, 1, 0}, {0.50, 0.50}},//Z 
{{ 1, 0,  0}, {1, 1, 1, 0}, {1.00, 0.50}},//A 
{{ 0.5, -0.866, 0}, {1, 1, 1, 0}, {0.75, 0.00}},//B 
{{-0.5, -0.866, 0}, {1, 1, 1, 0}, {0.25, 0.00}},//C 
{{-1, 0,  0}, {1, 1, 1, 0}, {0, 0.50}},//D 
{{-0.5, 0.866, 0}, {1, 1, 1, 0}, {0.25, 1.00}},//E 
{{ 0.5, 0.866, 0}, {1, 1, 1, 0}, {0.75, 1.00}} //F 
}; 

然而如果我不是註釋掉上面的聲明,並添加相同名稱的實例變量(頂點*頂點,而不是頂點頂點[]因爲我不能malloc的一個數組直接),然後執行以下操作,沒有呈現:

-(void)setVertices{ 
_Vertices = malloc(sizeof(Vertex) * 7); 

//Z 
_Vertices[0].position.x = 0; 
_Vertices[0].position.y = 0; 
_Vertices[0].position.z = 0; 
_Vertices[0].color.r = 1; 
_Vertices[0].color.g = 1; 
_Vertices[0].color.b = 1; 
_Vertices[0].color.a = 0; 
_Vertices[0].texCoords.x = 0.5; 
_Vertices[0].texCoords.y = 0.5; 

//A 
_Vertices[1].position.x = 1; 
_Vertices[1].position.y = 0; 
_Vertices[1].position.z = 0; 
_Vertices[1].color.r = 1; 
_Vertices[1].color.g = 1; 
_Vertices[1].color.b = 1; 
_Vertices[1].color.a = 0; 
_Vertices[1].texCoords.x = 1; 
_Vertices[1].texCoords.y = 0.5; 


//B 
_Vertices[2].position.x = 0.5; 
_Vertices[2].position.y = -0.866; 
_Vertices[2].position.z = 0; 
_Vertices[2].color.r = 1; 
_Vertices[2].color.g = 1; 
_Vertices[2].color.b = 1; 
_Vertices[2].color.a = 0; 
_Vertices[2].texCoords.x = 0.75; 
_Vertices[2].texCoords.y = 0.00; 


//C 
_Vertices[3].position.x = -0.5; 
_Vertices[3].position.y = -0.866; 
_Vertices[3].position.z = 0; 
_Vertices[3].color.r = 1; 
_Vertices[3].color.g = 1; 
_Vertices[3].color.b = 1; 
_Vertices[3].color.a = 0; 
_Vertices[3].texCoords.x = 0.25; 
_Vertices[3].texCoords.y = 0; 


//D 
_Vertices[4].position.x = -1; 
_Vertices[4].position.y = 0; 
_Vertices[4].position.z = 0; 
_Vertices[4].color.r = 1; 
_Vertices[4].color.g = 1; 
_Vertices[4].color.b = 1; 
_Vertices[4].color.a = 0; 
_Vertices[4].texCoords.x = 0; 
_Vertices[4].texCoords.y = 0.5; 


//E 
_Vertices[5].position.x = -0.5; 
_Vertices[5].position.y = 0.866; 
_Vertices[5].position.z = 0; 
_Vertices[5].color.r = 1; 
_Vertices[5].color.g = 1; 
_Vertices[5].color.b = 1; 
_Vertices[5].color.a = 0; 
_Vertices[5].texCoords.x = 0.25; 
_Vertices[5].texCoords.y = 1; 


//F 
_Vertices[6].position.x = 0.5; 
_Vertices[6].position.y = 0.866; 
_Vertices[6].position.z = 0; 
_Vertices[6].color.r = 1; 
_Vertices[6].color.g = 1; 
_Vertices[6].color.b = 1; 
_Vertices[6].color.a = 0; 
_Vertices[6].texCoords.x = 0.75; 
_Vertices[6].texCoords.y = 1; 
} 

這裏是我的設置功能:

-(void)setupGL{ 
self.effect = [[GLKBaseEffect alloc] init]; 

glGenBuffers(1, &_vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(_Vertices), _Vertices, GL_STATIC_DRAW); 

glGenBuffers(1, &_indexBuffer); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(_Indices), _Indices, GL_STATIC_DRAW); 
} 

這裏是我的繪製函數:

-(void)draw{ 
glPushGroupMarkerEXT(0,"drawHex"); 
_effect.texture2d0.envMode = GLKTextureEnvModeReplace; 
_effect.texture2d0.target = GLKTextureTarget2D; 
_effect.texture2d0.name = _texture.name; 
[self.effect prepareToDraw]; 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer); 

glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, position)); 

glEnableVertexAttribArray(GLKVertexAttribColor); 
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, color)); 

glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, texCoords)); 

//draw 
glDrawElements(GL_TRIANGLES, sizeof(_Indices)/sizeof(_Indices[0]),GL_UNSIGNED_BYTE, 0); 
glPopGroupMarkerEXT(); 
} 

如果它的事項紋理的對象之外創建一次,然後指向它的指針是傳入英寸創建像這樣的紋理:

-(void)setTextureImage:(UIImage *)image { 
NSError *error; 
_hexTexture = [GLKTextureLoader textureWithCGImage:image.CGImage options:nil error:&error]; 
if (error) { 
    NSLog(@"Error loading texture from image: %@",error); 
}} 

我是新來的所有這一切,它是gett試圖找出這裏發生的事情令人非常沮喪。

在我關於我廣闊的搜索看到了一些關於「捕獲的OpenGL ES框架」,但它似乎並沒有在Xcode的iPhone模擬器啓用,所以我不能深入到它:(

我會真的很想知道爲什麼發生這種情況。

我可以提供更多的代碼或解釋,這將有助於。

有什麼想法?

+0

你確定你調用了'setVertices'方法** **前試圖渲染什麼? – 2012-10-28 20:07:24

+1

絕對,我也確信調用setupGL – hobwell

+0

這是很奇怪的,然後之前調用它。 – 2012-10-28 20:22:05

回答

3

關於glBufferData的PARAM, 的sizeof(_Vertices)不爲static之間相同c和動態。 如果你想使用動態,你必須使用sizeof(Vertex)* 7而不是sizeof(_Vertices)。

+0

就是這樣!非常感謝!我沒有意識到對數組指針做sizeof將返回指針的大小而不是數組的大小。事後看來這很有道理,但我擔心我永遠不會看到這些,所以再次感謝你! – hobwell

+0

不客氣:) – koki