궁극적으로 각 개체에 다른 텍스처 좌표를 제공하여 단일 이미지를 사용하여 여러 개체 (육각형)에 텍스처를 적용하려고합니다.
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 소개
아무것도 렌더링하려고 시도하기 전에 ** setVertices' ** 메소드를 호출 하시겠습니까? –
절대적으로, 나는 setupGL – hobwell
을 호출하기 전에 전화를 걸었습니다. 정말 이상합니다. –