2013-09-28 3 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; 

}

Я надеюсь, что теперь более понятно, о чем Мне нужно.

+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 (Texture Mapping Unit) состояния относятся. В настольном OpenGL он может иметь любое значение в пределах диапазона: GL_TEXTURE0 - GL_TEXTURE0 + 79. OpenGL ES 2.0 гарантирует, что 2 TMU и iOS (которые всегда работают на оборудовании PowerVR SGX, дают вам 8).

У меня есть проблема в том, что сразу после установки активного блока текстуры с помощью переменной location, вы пытаетесь генерировать 3 текстурных имена (ручки) и хранить их в массиве GLuint имени location.

location не может быть как массивом имен текстур, так и TMU, который вы хотите связать. Более того, сразу после glGenTextures (...) вы связываете текстуру с именем 2, что имеет мало смысла. Я ожидал бы следующего звонка glBindTexture (...), следующего за glGenTextures (...), чтобы ссылаться на что-то из массива: location [].

Делать вещи хуже, перед вызовом [self loadTexture:@"image1.png" intoLocation:textures[1]], у вас есть строка кода: glGenTextures(0, &textures[3]);, который говорит OpenGL генерировать 0 имена текстур и хранить их в массиве GLuint начинающегося по адресу: &textures [3].

С вашим кодом слишком много ошибок, чтобы понять, что вы на самом деле пытаетесь сделать. Я думаю, вам, возможно, придется вникать в мульти-текстурирование и текстурирование в целом.

Смежные вопросы