-2

2 つのテクスチャをバインドしてテクスチャを取得しようとしていますが、画面に表示されるテクスチャは 1 つだけです。以下のコードは、テクスチャをロードする方法です..

- (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;

}

必要なものがより明確になったことを願っています。

4

1 に答える 1

3

実際のコードで質問を更新していただきありがとうございます。ここで、あなたのコードで 1 つの点が異常だと思います。それは という名前の変数に関係しています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 (テクスチャ マッピング ユニット) 状態を変更するすべての呼び出しが参照するテクスチャ ユニットを設定します。GL_TEXTURE0デスクトップ OpenGL では、 ~の範囲内の任意の値を持つことができますGL_TEXTURE0 + 79。OpenGL ES 2.0 は 2 つの TMU と iOS を保証します (PowerVR SGX ハードウェアで常に実行されている場合は 8 つになります)。

私が抱えている問題は、変数を使用してアクティブなテクスチャ ユニットを設定した直後に、 3 つのテクスチャ名 (ハンドル) を生成し、それらを名前付きlocationの配列に格納しようとすることです。GLuintlocation

locationテクスチャ名の配列とバインドする TMU の両方を指定することはできません。glGenTextures (...)さらに、という名前のテクスチャをバインドした直後は、2ほとんど意味がありません。配列内から何かを参照するために、glBindTexture (...)次の次の呼び出しが表示されることを期待しています: 。glGenTextures (...)location []

さらに悪いことに、 を呼び出す前に、 OpenGL に 0 のテクスチャ名を生成し、それらをアドレス: で始まる配列に格納するように指示[self loadTexture:@"image1.png" intoLocation:textures[1]]するコード行があります。glGenTextures(0, &textures[3]);GLuint&textures [3]

実際に何をしようとしているのかを理解するには、コードに問題が多すぎます。マルチテクスチャリングとテクスチャリング全般についてブラッシュアップする必要があるかもしれません。

于 2013-09-28T18:40:18.163 に答える