2012-07-19 3 views
2

이것은 iphone에서 내 첫 번째 응용 프로그램이며 질감을 GLKView에서로드하려고합니다. 나는 GLKVIewController 클래스를 사용하지 않고있다. . 많은 검색을 한 후에 이미지를 2D 텍스처로로드 할 관리자가 있다고 생각하지만 여전히 사각형에 매핑하는 방법을 모르겠습니다. 다음은 사각형을 그릴 때 사용하는 코드입니다. viewDidLoad에있는 컨텍스트 초기화iOS5의 사각형에 이미지를 사용하여 2D 텍스처 넣기

GLfloat gSqaureVertexData[216] = 
{ 
    // Data layout for each line below is: 
    // positionX, positionY, positionZ,  normalX, normalY, normalZ, 
    0.5f, -0.5f, -0.5f,  0.0f, 0.0f, -1.0f, 
    -0.5f, -0.5f, -0.5f,  0.0f, 0.0f, -1.0f, 
    0.5f, 0.5f, -0.5f,   0.0f, 0.0f, -1.0f, 
    0.5f, 0.5f, -0.5f,   0.0f, 0.0f, -1.0f, 
    -0.5f, -0.5f, -0.5f,  0.0f, 0.0f, -1.0f, 
    -0.5f, 0.5f, -0.5f,  0.0f, 0.0f, -1.0f 
}; 

:

정점 배열을 만들기

context = [[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2]; 
    CAEAGLLayer *eaglLayer = (CAEAGLLayer*)self.view.layer; 
    eaglLayer.opaque=NO; 

    glView = [[GLKView alloc]initWithFrame:CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y+45, self.view.frame.size.width, self.view.frame.size.height-100.0f)]; 

    glView.context=context; 
    glView.delegate=self; 
    glView.backgroundColor=[UIColor clearColor]; 
    glView.drawableDepthFormat = GLKViewDrawableDepthFormat24; 
    [self setupGL]; 
    [self.view addSubview:glView]; 

로드 텍스처 객체와 그외 설정에

-(void) setupGL 
{ 
    [EAGLContext setCurrentContext:context]; 

    //[self loadShaders]; 

    self.effect = [[GLKBaseEffect alloc] init]; 
    //self.effect.light0.enabled = GL_TRUE; 
    //self.effect.light0.diffuseColor = GLKVector4Make(1.0f, 0.4f, 0.4f, 1.0f); 

    glEnable(GL_DEPTH_TEST); 

    glGenVertexArraysOES(1, &_vertexArray); 
    glBindVertexArrayOES(_vertexArray); 

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

    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(0)); 
    glEnableVertexAttribArray(GLKVertexAttribNormal); 
    glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(12)); 

    glBindVertexArrayOES(0); 
    glBindTexture(GL_TEXTURE_2D, texture[0]); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    NSString *path = [[NSBundle mainBundle] pathForResource:@"texture" ofType:@"png"]; 
    NSData *texData = [[NSData alloc] initWithContentsOfFile:path]; 
    UIImage *image = [[UIImage alloc] initWithData:texData]; 
    if (image == nil) 
     NSLog(@"Do real error checking here"); 

    GLuint width = CGImageGetWidth(image.CGImage); 
    GLuint height = CGImageGetHeight(image.CGImage); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    void *imageData = malloc(height * width * 4); 
    CGContextRef contextTex = CGBitmapContextCreate(imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); 
    CGContextClearRect(contextTex, CGRectMake(0, 0, width, height)); 
    CGContextTranslateCTM(contextTex, 0, height - height); 
    CGContextDrawImage(contextTex, CGRectMake(0, 0, width, height), image.CGImage); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 

    CGContextRelease(contextTex); 

    free(imageData); 
    [image release]; 
    [texData release];  
} 

drawInRect에 sqaure 도면에 이미지를 PNG로 :

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

    glBindVertexArrayOES(_vertexArray); 

    // Render the object[[ with GLKit 
    [self.effect prepareToDraw]; 

    glDrawArrays(GL_TRIANGLES, 0, 36); 

    // Render the object again with ES2 
    glUseProgram(_program); 

    glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); 
    glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m); 

    glDrawArrays(GL_TRIANGLES, 0, 36); 
} 

답변

0
당신은 질감이 정점의 각 좌표 추가 활성 질감과 텍스처를 설정하고 텍스처 좌표의 정점 속성을 추가해야합니다

:

정점 데이터 :

//Vertex, Normal, Texture coordinate (ranges from 0 to 1) 
0.5f, -0.5f, -0.5f,  0.0f, 0.0f, -1.0f, 1, 1, 
-0.5f, -0.5f, -0.5f,  0.0f, 0.0f, -1.0f, 0, 1, 
0.5f, 0.5f, -0.5f,   0.0f, 0.0f, -1.0f, 1, 0, 
0.5f, 0.5f, -0.5f,   0.0f, 0.0f, -1.0f, 1, 0, etc 

(이 GLKit에 대해 확실하지 그 일의 표준 OpenGL을 방법입니다) 활성화 질감을 설정합니다

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, textures[0]); 

설정 텍스처 속성 (완전히 정확하지 않을 수 있습니다, 나는 famil 아니에요 iar with GLKit) :

glEnableVertexAttribArray(GLKVertexAttribTexCoord); 
glVertexAttribPointer(GLKVertexAttribTexCoord, 2, GL_FLOAT, GL_FALSE, 24, BUFFER_OFFSET(16)); 
관련 문제