2013-09-28 4 views
-2

두 텍스처를 바인딩하여 텍스처를 얻으려고합니다. 그러나 하나의 텍스처 만 화면에 표시됩니다. 코드 울부 짖는 소리가 .. 내가 텍스처를로드하는 방법두 텍스처를 병합하는 방법

- (void)loadTexture:(NSString *)name intoLocation:(GLuint)location { 

CGImageRef textureImage = [UIImage imageNamed:name].CGImage; 
if (textureImage == nil) { 
    NSLog(@"Failed to load texture image"); 
    return; 
} 

NSInteger texWidth = CGImageGetWidth(textureImage); 
NSInteger texHeight = CGImageGetHeight(textureImage); 

GLubyte *textureData = (GLubyte *)malloc(texWidth * texHeight * 4); 

CGContextRef textureContext = CGBitmapContextCreate(textureData, 
                texWidth, texHeight, 
                8, texWidth * 4, 
                CGImageGetColorSpace(textureImage), 
                kCGImageAlphaPremultipliedLast); 
CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)texWidth, (float)texHeight), textureImage); 
CGContextRelease(textureContext); 
glActiveTexture(location); 
glGenTextures(3, &location); 
glBindTexture(GL_TEXTURE_2D,2); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); 

free(textureData); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glEnable(GL_TEXTURE_2D);} 

그리고 여기에 내가 텍스처로드를 호출하는 방법입니다 :

- (BOOL)createFramebuffer { 
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; 

eaglLayer.opaque = YES; 
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, 
           kEAGLDrawablePropertyColorFormat, nil]; 

context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; 

if (!context || ![EAGLContext setCurrentContext:context]) { 
    [self release]; 

} 
    [self setupView]; 
glGenTextures(0, &textures[3]); 

[self loadTexture:@"image1.png" intoLocation:textures[1]]; 
[self loadTexture:@"image2.png" intoLocation:textures[0]]; 




glGenFramebuffersOES(2, &viewFramebuffer); 
glGenRenderbuffersOES(2, &viewRenderbuffer); 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 

[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer]; 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); 

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); 
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); 

if (USE_DEPTH_BUFFER) { 
    glGenRenderbuffersOES(1, &depthRenderbuffer); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); 
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight); 
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); 
} 

if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) { 
    NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)); 
    return NO; 
} 

return YES; 

}

I에 대한 추가 분명하다 지금 희망을 무엇 나는 필요하다.

+2

당신이하려는 것을 설명하십시오. "두 텍스처 합치기"라는 문맥을 추가하지 않아도 아무 의미도 없습니다. 또한 지금까지 정확히 무엇을 시도했는지 설명하십시오. – derhass

+0

"병합"이라고 말하면 실제로 의미하는 것은 "혼합"이라고 생각합니다. 이 경우 실제로 텍스처를 얻지는 않지만 하나의 텍스처를 사용하여 그리기 결과를 이전 결과 (예 : 다른 텍스처)와 결합하여 새 픽셀을 생성합니다. 대부분의 경우 (예 : 알파 블렌딩) 주문 관련 작업입니다. 어떤 경우이든, 어떤 종류의 코드 나 더 나은 설명을 보지 않고도이를 대답 할 방법이 없습니다. –

답변

3

실제 코드로 질문을 업데이트 해 주셔서 감사합니다. 이제 코드에서 이상한 점이 하나 있습니다. 변수는 location입니다.

glActiveTexture (location); 
glGenTextures (3, &location); 
glBindTexture (GL_TEXTURE_2D, 2); 
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); 

glActiveTexture (...)

는 TMU (텍스처 매핑 단위) 상태를 수정 모든 통화가 참조하는 텍스처 유닛을 설정합니다. 데스크톱 OpenGL에서는 범위 내에서 값을 가질 수 있습니다 : GL_TEXTURE0 ~ GL_TEXTURE0 + 79. OpenGL ES 2.0은 2 개의 TMU와 iOS (항상 PowerVR SGX 하드웨어에서 실행되는 8 개를 제공합니다)를 보장합니다.

내가 가진 문제는 즉시 변수 location를 사용하여 활성 텍스처 유닛을 설정 한 후, 당신은 3 텍스처 이름 (핸들)을 생성하고 location 이름 GLuint의 배열에 저장하려고한다는 것입니다.

location은 텍스처 이름의 배열과 바인딩하려는 TMU가 될 수 없습니다. 더구나, glGenTextures (...) 바로 뒤에 2이라는 텍스처를 바인드하는 것은 거의 의미가 없습니다. 다음 전화 glBindTexture (...) 다음에 glGenTextures (...) 다음에 배열 내의 어떤 것을 참조 할 것을 기대합니다 : location []. glGenTextures(0, &textures[3]); 0 질감 이름을 생성하고 주소에서 시작 GLuint의 배열에 저장하는 OpenGL을 알려줍니다 : &textures [3]

[self loadTexture:@"image1.png" intoLocation:textures[1]]를 호출하기 전에, 상황은 악화 만들기, 당신은 코드의 라인을 가지고있다.

코드에서 실제로 시도하려는 내용을 이해하는 데 너무 많은 문제가 있습니다. 나는 당신이 일반적으로 멀티 텍스처링과 텍스쳐링에 대해 솔질 할 필요가 있다고 생각합니다.

관련 문제