2012-10-28 5 views
4

궁극적으로 각 개체에 다른 텍스처 좌표를 제공하여 단일 이미지를 사용하여 여러 개체 (육각형)에 텍스처를 적용하려고합니다.
OpenGL ES 2.0 및 GLKit 사용하기 나는 수동으로 malloc하고 Vertex 배열을 초기화 할 때 어떤 이유로 렌더링되지 않는다는 것을 발견하기위한 방법을 생각해 냈습니다. 정적으로 할당 된 버텍스 배열 버전이 정상적으로 작동하기 때문에 이것이 왜 그 이유인지 이해할 수 없습니다.Vertex가 수동으로 생성되면 (malloc 된 후 초기화 될 때) 왜 객체가 렌더링되지 않지만 정적으로 할당되면 렌더됩니까?

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 할 수 없기 때문에 Vertex Vertices [] 대신 Vertex * Vertices)를 추가 한 다음 아무 것도 렌더링하지 않고 다음을 수행하면됩니다.

이 텍스처는 객체 외부에서 한 번 생성 한 후 포인터가 중요한 경우

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

나는이 모든 것을 처음 접했고 gett 여기에 무슨 일이 일어나고 있는지 알아 내려고 아주 실망 스럽습니다. I에 대한 나의 광대 한 검색에서

은 '캡처 OpenGL을 ES 프레임'에 대해 뭔가를 보았다하지만 그래서 그것을 파고 수 없습니다 :(

나는 것입니다 엑스 코드에서 아이폰 시뮬레이터를 사용할 수있을 것 같지 않습니다 정말 이런 일이 이유를 알고 싶다. 나는 그것이 도움이 될 것입니다 경우 더 많은 코드 또는 설명을 제공 할 수

을.

어떤 생각을? glBufferData의 PARAM 소개

+0

아무것도 렌더링하려고 시도하기 전에 ** setVertices' ** 메소드를 호출 하시겠습니까? –

+1

절대적으로, 나는 setupGL – hobwell

+0

을 호출하기 전에 전화를 걸었습니다. 정말 이상합니다. –

답변

3

, 를 sizeof (_Vertices)는 stati과 동일하지 않습니다 c 및 동적. 동적을 사용하려면 sizeof (_Vertices) 대신 sizeof (Vertex) * 7을 사용해야합니다.

+0

그건 정확히 그랬어! 정말 고맙습니다! 나는 배열 포인터에 sizeof를하는 것이 배열의 크기보다는 포인터의 크기를 반환한다는 것을 깨닫지 못했다. 뒤늦은 지혜로는 완벽하게 이해할 수 있지만, 결코 그것을 본 적이 없으므로 두려워합니다. 다시 한번 감사드립니다! – hobwell

+0

당신은 환영합니다 :) – koki