использование glTexSubImage2D в OpenGLES 1.1 - PullRequest
0 голосов
/ 18 октября 2010

Я отправляю 3D-сцену opengl через IP-ссылку на мое приложение для iPhone, созданное с использованием SDK 4.1. Сначала я визуализирую 3D-сцену с помощью FBO, читаю ее с помощью glReadPixels и отправляю в приложение iphone. Если я преобразую данные пикселей, полученные приложением, в UIImage, я вижу, что они отображаются правильно. Но когда я использую те же данные в glTexSubImage2D с использованием OpenGLES 1.1 (на iPhone 3G), я ничего не вижу. Есть идеи, что может пойти не так? Я использую glTexSubImage2D, так как glDrawPixels не поддерживается. Какие-нибудь примеры / учебники, чтобы решить эту проблему? Ценю любую помощь.

Заранее спасибо.

Code -

    - (id) initWithFrame: (CGRect) frame
    {
    .....
    api = kEAGLRenderingAPIOpenGLES1;
    m_context = [[EAGLContext alloc] initWithAPI:api];

    glGenFramebuffersOES(1, &m_frameBuffer);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, m_frameBuffer);
    glGenRenderbuffersOES(1, &m_colorRenderbuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer);

    glGenTextures(1, &m_tex);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
    ....
    }

    - (void) drawView: (CADisplayLink*) displayLink
    {
    glBindTexture(GL_TEXTURE_2D, m_tex);
    glTexSubImage2D(GL_TEXTURE_2D, 0,0,0, 
            WIDTH, HEIGHT, 
            GL_BGRA, 
            //GL_RGBA,
            GL_UNSIGNED_BYTE, 
            m_pixelData); 

const GLfloat quadVertices[] = {
    -1.0f, -1.0f, 0.0f,
    -1.0f, 1.0f, 0.0f,
    1.0f, 1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    -1.0f, -1.0f, 0.0f
};

// Sets up an array of values for the texture coordinates.
const GLfloat quadTexcoords[] = {
    0.0f, 0.0f,
    0.0f, 1.0f,
    1.0f, 1.0f,
    1.0f, 0.0f,
    0.0f, 0.0f
};
glVertexPointer(3, GL_FLOAT, 0, quadVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, quadTexcoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, m_frameBuffer);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer);

    [m_context presentRenderbuffer:GL_RENDERBUFFER_OES];
    }

Ответы [ 3 ]

0 голосов
/ 11 ноября 2010

Имейте в виду, что ширина и высота текстур должны быть степенью 2 на платформе iphone / ipad.если это не так, вы получаете пустой экран.

0 голосов
/ 23 июня 2011

Почему вы используете 5 вершин для создания треугольной полосы?Я предполагаю, что вам нужен квадрат из 2 треугольников, поэтому вашей полосе нужно только 4 вершины.

Кроме того, в вашем случае было бы проще просто инициализировать квадратную текстуру и визуализировать ее так (без использованиявершины):

/* do the glGenTextures() / glTexImage() / glBindTexture() dance here */
int box[] = { nXOffset, nYOffset, nWidth, nHeight };  /* define the part of the texture you're going to render */
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, box);
glDrawTexfOES(0.0f, 0.0f, 0.0f, nWidth, nHeight); /* rectangle in the screen coordinates, where to render the previously defined part of the texture */
0 голосов
/ 18 октября 2010

Если вы используете GL_*_MIPMAP_* для GL_TEXTURE_[MIN|MAG]_FILTER (обратите внимание на значения по умолчанию !), Убедитесь, что вы действительно предоставляете данные изображения для всех уровней mipmap.

...