0

シェイプに使用するテクスチャ配列を設定したいと思います。私はインターネットでこのトピックを調査しましたが、私のような初心者が利用できる参考文献はほとんどありません. 繰り返しますが、達成しようとしているのは、さまざまなテクスチャをシェイプのさまざまな面にマップするために使用できるテクスチャ配列です。今のところ、UIView から生成したテクスチャは 1 つしかありません。

私の主な質問は次のとおりです。

  • この配列をどのようにセットアップしますか?
  • その配列にテクスチャをロードするにはどうすればよいですか?
  • この配列を使用するにはどうすればよいですか?

これが私のコードです:

- (void)setupGL {



    [EAGLContext setCurrentContext:self.myContext];

    self.effect = [[GLKBaseEffect alloc] init];
    self.layer.contentsScale = 2.0;
    BOOL useTexture = YES;

    // Create default framebuffer object.
    glGenFramebuffers(1, &defaultFrameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, defaultFrameBuffer);

    myView = [[MyView alloc]initWithFrame:CGRectMake(0,0,320,320)];

    self.effect.transform.projectionMatrix = GLKMatrix4MakePerspective(45.0f,0.9f, 0.01f, .08f);
    self.effect.transform.projectionMatrix = GLKMatrix4Translate(self.effect.transform.projectionMatrix, 0, 0.1, 1.2);
    rotMatrix = GLKMatrix4Translate(self.effect.transform.modelviewMatrix,0,0,-2);
    self.effect.transform.modelviewMatrix = rotMatrix;


        /*********************
         MAPPING UIVIEW ONTO THE FACE
         ****************/

        CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB();

        self.effect.texture2d0.enabled = true;

        GLubyte *pixelBuffer = (GLubyte *)malloc(
                                                 4 *
                                                 myView.bounds.size.width * coordToPixScale *
                                                 myView.bounds.size.height * coordToPixScale);


            CGContextRef context =
            CGBitmapContextCreate(pixelBuffer,
                                  myView.bounds.size.width*coordToPixScale, myView.bounds.size.height*coordToPixScale,
                                  8, 4*myView.bounds.size.width *coordToPixScale,
                                  colourSpace,
                                  kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
            CGColorSpaceRelease(colourSpace);

            // draw the view to the buffer
            [myView.layer renderInContext:context];

            // upload to OpenGL
            glTexImage2D(GL_TEXTURE_2D, 0,
                         GL_RGBA,
                         myView.bounds.size.width * coordToPixScale, myView.bounds.size.height * coordToPixScale, 0,
                         GL_RGBA, GL_UNSIGNED_BYTE, pixelBuffer);

            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

            // clean up
            CGContextRelease(context);




        glGenBuffers(1, &texArray);
        glBindBuffer(GL_ARRAY_BUFFER, texArray);
        glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
        glBufferData(GL_ARRAY_BUFFER, sizeof(TexCoords), TexCoords, GL_STATIC_DRAW);

        glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0,0);

        /**************************
         ******************************************/
        free(pixelBuffer);




    glGenRenderbuffers(1, &depthBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, myView.bounds.size.width * coordToPixScale, myView.bounds.size.height * coordToPixScale);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);

    glEnable(GL_DEPTH_TEST);

    glGenBuffers(1, &vertexArray);
    glBindBuffer(GL_ARRAY_BUFFER, vertexArray);
    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
    glVertexAttribPointer(GLKVertexAttribPosition,3,GL_FLOAT,GL_FALSE,0,0);



}

このメソッドは、描画されるときに呼び出されます。

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {

    self.opaque = NO;

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    [self.effect prepareToDraw];

    glDrawArrays(GL_TRIANGLES, 0, sizeof(Vertices) / (sizeof(GLfloat) * 3));
}
4

1 に答える 1

0

GLKitを使用しているのを見ると、テクスチャをより簡単にロードできると思います。最初にあなたを作成しますCGImageRef

   CGImageRef image0 = 
  [[UIImage imageNamed:@"image0.png"] CGImage];

GLKTextureInfo次のようにivarにロードしtextureInfo0ます。

  self.textureInfo0 = [GLKTextureLoader 
  textureWithCGImage:image1
  options:[NSDictionary dictionaryWithObjectsAndKeys:
     [NSNumber numberWithBool:YES], 
     GLKTextureLoaderOriginBottomLeft, nil] 
  error:NULL];

2 番目のテクスチャでまったく同じことを行います。という名前にする必要がありますtextureInfo1

テクスチャ座標のロードは、アトリビュートglEnableVertexAttribArrayglVertexAttribPointer使用して行われます。GLKVertexAttribTexCoord0以上で設定できたと思います。テクスチャからターゲットの三角形に座標をマッピングする必要があります。たとえば、2 つの三角形で構成される正方形を描画する場合、ソース イメージの S 座標と T 座標を 2 回、つまりそれぞれの三角形ごとにマッピングする必要があります。たとえば、座標を持つ三角形 1:

{0.0f, 0.0f}, {1.0f, 0.0f}, {0.0f, 1.0f}. 

(プロットすると、三角形であることがわかります)

次に、正方形の 2 番目の三角形は次のようになります。

{1.0f, 0.0f}, {0.0f, 1.0f}, {1.0f, 1.0f}. 

次に、描画方法で。

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect 

最初に、初期テクスチャを設定します。

    self.effect.texture2d0.name = self.textureInfo0.name;
    self.effect.texture2d0.target = self.textureInfo0.target;

    [self.effect prepareToDraw];

で必要に応じて三角形を描きますglDrawArrays。次に、2 番目のテクスチャに置き換えます。

    self.effect.texture2d0.name = self.textureInfo1.name;
    self.effect.texture2d0.target = self.textureInfo1.target;

   [self.effect prepareToDraw];

で残りの三角形を描きglDrawArraysます。2 番目のテクスチャを使用します。

self.effect.texture2d0.nameself.effect.texture2d0.targetを別のインスタンスに置き換えてGLKTextureInfo、別のテクスチャを描画します。

于 2013-01-23T16:20:56.657 に答える