2014-01-21 9 views
1

Это просто поделиться тем, что заняло у меня много времени, чтобы разобраться. Если вам не нужен ваш Depthbuffer или у вас нет настройки точки вставки буфера глубины в EGL, это может помочь.glCheckFramebufferStatus возвращает 36054 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

По какой-то причине я не мог получить рендеринг в текстуру для работы установки визуализации буфера объекта RBO в буфер глубины: как ошибки так

GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, 
      GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, 
      juliaTex[0], 0); 
    rain.checkGlError("glFramebufferTexture2D"); 
    GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, 
      GLES20.GL_DEPTH_ATTACHMENT, GLES20.GL_RENDERBUFFER, 
      juliaRBO[0]); 
    rain.checkGlError("glFramebufferRenderbuffer"); 

    int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER); 

вызывает status == GLES20.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

Если меняет визуализацию хранения буфера GLES20.GL_RGBA4, в отличие от GLES20.DEPTH_COMPONENT16 и изменить GLES20.GL_DEPTH_ATTACHMENT к GLES20.GL_COLOR_ATTACHMENT0 то ошибка уходит,

изменить этот

// create render buffer and bind 16-bit depth buffer 
    GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, juliaRBO[0]); 
    rain.checkGlError("glBindRenderBuffer"); 
    GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.DEPTH_COMPONENT16, 
      rain.width, rain.height); 

к этому

// create render buffer and bind 16-bit depth buffer 
    GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, juliaRBO[0]); 
    rain.checkGlError("glBindRenderBuffer"); 
    GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_RGBA4, 
      rain.width, rain.height); 

И исходный код к этому:

GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, 
      GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, 
      juliaTex[0], 0); 
    rain.checkGlError("glFramebufferTexture2D"); 
    GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, 
      GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_RENDERBUFFER, 
      juliaRBO[0]); 
    rain.checkGlError("glFramebufferRenderbuffer"); 

затем status == GLES20.GL_FRAMEBUFFER_COMPLETE

Но текстура пуст.

здесь вызов для создания текстуры ХРАНЕНИЯ

// bind texture 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, juliaTex[0]); 

    // clamp texture to edges 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, 
      GLES20.GL_CLAMP_TO_EDGE); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, 
      GLES20.GL_CLAMP_TO_EDGE); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, 
      GLES20.GL_LINEAR); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, 
      GLES20.GL_LINEAR); 
    rain.checkGlError("glTexParameter JuliaTex"); 

    // create it 
    /* 
    int[] buf = new int[rain.width * rain.height]; 
    juliaTexBuff = ByteBuffer.allocateDirect(buf.length 
      * rain.FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asIntBuffer(); 
    */ 
    // generate the textures 
    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 
      rain.width, rain.height, 0, GLES20.GL_RGBA, 
      GLES20.GL_UNSIGNED_SHORT_4_4_4_4, null); 

ответ

-3

Чтобы получить эту работу в дополнении к прикреплению рендера буфера точке крепления цвета, который я поменял порядок вложения FrameBuffer:

GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, 
      GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_RENDERBUFFER, 
      juliaRBO[0]); 
    rain.checkGlError("glFramebufferRenderbuffer"); 
    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, 
      GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, 
      juliaTex[0], 0); 
    rain.checkGlError("glFramebufferTexture2D"); 

Чтобы Texture2D был прикреплен к цветному слою Framebuffer после Renderbuffer. Я предполагаю, что последняя точка подключения - это то, что использует OpenGL ES.

+0

** - 1 **: Вы сделали больше, чем просто добавили текстуру в этот код. Фактически вы привязали ваш рендеринг к точке подключения ** 0 **, а затем заменили это приложение на ваше изображение текстуры. Это сильно отличается от того, что вы пытались изначально. Обновите свой вопрос, чтобы показать, как вы распределяете хранилище для своей текстуры и вашего рендеринга, поскольку это почти наверняка, где ваша ошибка *** на самом деле ***. При этой текущей настройке у вас нет буфера глубины. –

+0

Я не думаю, что моя настройка EGL имеет точку привязки буфера глубины. Это и является причиной ошибки. Вероятно, вы знаете намного больше об этом, чем я, и это решение может показаться глупым, но это всего лишь обходное решение, которое, вероятно, поможет большему количеству хакеров, чем прибегать к компоненту Attachment Point. каждому его – HPP

+0

Все FBOs имеют точку подключения буфера глубины, но формат и размеры изображения RBO/текстуры, которое вы можете прикрепить, могут быть очень ограничительными. Основная проблема, которую я вижу сейчас, заключается в том, что ваша текстура juliaTex [0] ', вероятно, не имеет таких же размеров, как ваш RBO, поэтому я просил посмотреть, как вы выделили хранилище для этой текстуры. Нет оснований даже создавать/присоединять RBO к тому, что вы делаете прямо сейчас, потому что вы немедленно связываете что-то еще над RBO. –