سؤال

لقد كنت تواجه صعوبة في العثور على كود مباشر إلى تصدر المشهد الملمس في OpenGL ES (خصيصا لفون ، إذا كان ذلك من المسائل).أنا مهتم في معرفة ما يلي:

  1. كيف تجعل المشهد الملمس في OpenGL ES?
  2. ما يجب المعلمات يمكنك استخدامه لإنشاء نسيج أنه قادر على تقديم الهدف في OpenGL ES?
  3. هل هناك أي آثار تطبيق هذه المقدمة مادة إلى أخرى الأوليات?
هل كانت مفيدة؟

المحلول

هذا هو كيف أفعل ذلك.

يمكنني تحديد الملمس متغير (يمكنني استخدام أبل Texture2D الدرجة, ولكن يمكنك استخدام برنامج OpenGL نسيج الهوية إذا كنت تريد) ، frame buffer:

Texture2d * texture;
GLuint textureFrameBuffer;

ثم في مرحلة إنشاء الملمس ، frame buffer وإرفاق renderbuffer.هذه تحتاج فقط إلى القيام بذلك مرة واحدة:

texture = [[Texture2D alloc] initWithData:0 
                             pixelFormat:kTexture2DPixelFormat_RGB888
                             pixelsWide:32
                             pixelsHigh:32
                             contentSize:CGSizeMake(width, height)];

// create framebuffer
glGenFramebuffersOES(1, &textureFrameBuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer);

// attach renderbuffer
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture.name, 0);

// unbind frame buffer
glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);

في كل مرة كنت تريد أن تجعل الملمس ، أنا:

glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer);

...
// GL commands
...

glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);

حول سؤالك 3, هذا هو, يمكنك استخدام الملمس كما لو أنها أي مادة أخرى.

نصائح أخرى

لجعل المشهد إلى نسيج يجب استخدام framebuffer المرتبطة الملمس.هنا هو الطريقة التي أنا خلقت لتبسيط الأمر :

void glGenTextureFromFramebuffer(GLuint *t, GLuint *f, GLsizei w, GLsizei h)
{
    glGenFramebuffers(1, f);
    glGenTextures(1, t);

    glBindFramebuffer(GL_FRAMEBUFFER, *f);

    glBindTexture(GL_TEXTURE_2D, *t);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *t, 0);

    GLuint depthbuffer;
    glGenRenderbuffers(1, &depthbuffer);    
    glBindRenderbuffer(GL_RENDERBUFFER, depthbuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, w, h);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthbuffer);

    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if(status != GL_FRAMEBUFFER_COMPLETE)
        NSLog(@"Framebuffer status: %x", (int)status);
}

يمكنك إنشاء الإطار العازل و الملمس بسهولة :

GLuint _texture, _framebuffer;
GLsizei w,h;
float scale = [UIScreen mainScreen].scale;
w = self.view.bounds.size.width * scale;
h = self.view.bounds.size.height * scale;
glGenTextureFromFramebuffer(&_texture, &_framebuffer, w, h);

يمكنك استخدامها في وقت لاحق _framebuffer لتقديم المشهد في _texture في رسم الطريقة :

glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
//draw here the content you want in the texture
//_texture is now a texture with the drawn content

//bind the base framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, 0);
//or if you use GLKit
[view bindDrawable];
//draw normaly

الآن يمكنك أن تفعل ما تريد مع الملمس.إذا كنت تريد أن تفعل بعض بعد تجهيز (طمس, إزهار, الظل, الخ...) يمكنك !

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top