2010-10-18 2 views
0

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

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

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

, где ваш вызов отрисовки? – Bahbar

+0

Включенный образец код для демонстрации –

ответ

0

Почему вы используете 5 вершин, чтобы составить треугольную полоску? Я предполагаю, что вам нужен квадрат из двух треугольников, поэтому ваша полоска нуждается только в 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

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

+0

Спасибо. Но я получаю тот же результат, если я удалю код mipmap. Я ничего не вижу. –

+0

Включен код выборки. «Dont see anything» подразумевает, что я не вижу 3D-пиксельные данные. Просто пустой экран, где находится код чертежа. –

0

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

+0

Только на старых устройствах. Устройства OpenGL ES 2.0 могут поддерживать любой размер. Исключения могут быть добавлены в код рендеринга для проверки типа устройства и, следовательно, вывода версии OpenGL ES и соответствующим образом скорректированы. –

Смежные вопросы