2017-12-20 20 views
-1

OpenGL 프로그램을 GLESv2로 이식하려고합니다. 이 프로그램은 기본 프레임 버퍼에 텍스처를 사용합니다 (OpenGL에서도 작동하는 fbo로 렌더링하면 실패합니다).glDrawArrays가 GLESv2에서 GL_INVALID_VALUE을 던졌습니다.

glBindFramebuffer(GL_FRAMEBUFFER, 0); 
    glVertexAttribPointer(bgra_texcoords, 2, GL_FLOAT, GL_FALSE, 0, display_texcoords); 
    glEnableVertexAttribArray(bgra_texcoords); 
    DEBUG_ERROR_CHECK(); 

    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); 
    glUseProgram(bgra_program); 
    glBindTexture(GL_TEXTURE_2D, inst->texture); 
    glUniform1i(bgra_texture, 0); 
    glViewport(inst->x, root_surface->h - (inst->y + inst->h), inst->w, inst->h); 
    DEBUG_ERROR_CHECK(); 

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
    DEBUG_ERROR_CHECK(); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glFlush(); 

OpenGL에서는 제대로 작동하지만 GLESv2에서는 glDrawArrays()가 실패합니다. 나는이 질문을 읽었다. 내 문제와 매우 흡사 한 glDrawElements throw GL_INVALID_VALUE​ error이지만 VertexArray를 사용하지 않아서 솔루션을 코드에 적용하는 방법을 알 수 없다.

inst-> texture는 glTexImage2D()로 업로드 된 텍스처입니다. 나는 바로 쉐이더를 EGL을 초기화하고 컴파일 후 vertex_buffer을 만들어 :

glGenBuffers(1, &vertex_buffer); 
    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), 
      vertices, GL_STATIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); 
    glVertexAttribPointer(bgra_pos, 2, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(bgra_pos); 
    DEBUG_ERROR_CHECK(); 

편집 : https://github.com/fernando-rodriguez/mediabox/blob/bc4135d9568b2c5b4e8f39ac63ded2cb66023bcd/src/lib/ui/video-opengl.c : 현재 전체 소스 파일을 볼 수 있습니다. 이 파일은 컴포 지터의 비디오 "드라이버"이며, 2D 서페이스를 만들어 화면에 렌더링합니다. 질문에 문제가 있거나 뭔가 빠졌을 경우 의견을 게시하여 해결할 수 있도록하십시오. 감사.

답변

0

나는 그것을 알아 냈다. eglCreateContext() 후에 eglBindAPI()를 호출하여 실제로 GLES1 컨텍스트를 작성하고 있다고 생각했습니다.