2012-03-03 8 views
1

Я пытаюсь создать текстуру OpenGL ES 1.1 и заполнять с визуализированным контентом.Офсетная визуализированная текстура отображает пустой прямоугольник на экране

Подготовка текстуры:

glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

GLuint texFrambuffer; 
glGenFramebuffers(1, &texFrambuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, texFrambuffer); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER) ; 
if(status != GL_FRAMEBUFFER_COMPLETE) { 
    NSLog(@"failed to make complete framebuffer object %x", status); 
    // this message doesn't appear, thus, framebuffer is complete 
} 

glViewport(0, 0, 32, 32); 

glClearColor(1.0f, 0.0f, 1.0f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 

GLfloat vertices[] = { 
    10.0f, 10.0f, 0.0f, 
    20.0f, 40.0f, 0.0f, 
    10.0f, 30.0f, 0.0f 
}; 
glColor4f(0.0f, 1.0f, 0.0f, 1.0f); 
glVertexPointer(3, GL_FLOAT, 0, vertices); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 
glDeleteFramebuffers(1, &texFrambuffer); 

рендеринга текстур в сцене:

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, texture); 

glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 
GLshort texCoord[] = {0, 0, 0, 1, 1, 0, 1, 1}; 
GLfloat vertices2[] = {0.0, 0.0, 0.0, 31.0f, 31.0f, 0.0f, 31.0f, 31.0f}; 
glVertexPointer(2, GL_FLOAT, 0, vertices2); 
glTexCoordPointer(2, GL_SHORT, 0, texCoord); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

glDisable(GL_TEXTURE_2D); 

Полный исходный код доступен на Bitbucket: https://bitbucket.org/amjaliks/gl2/src/66ee4932e212/GL2/GL2View.m

Там другое содержимое визуализируется правильно. Проблема только с этой текстурой - она ​​отображается как белый прямоугольник.

Я изучил много примеров, но до сих пор не могу понять, что я делаю неправильно. Чего не хватает?


Update 1: Я заметил, если установить glClearColor() и вызвать glClear() в то время как texFrambuffer связан, эти изменения сохраняются в моей текстуры. Таким образом, что-то не так с glDrawArrays() и/или смежными вещами.

Нужен ли мне режим матрицы и проекции для моего texFrambuffer?


Update 2: Я пытался также использовать glCopyTexImage2D, чтобы скопировать содержимое из «основного» фреймбуфера в текстуру.

glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

glViewport(0, 0, 32, 32); 

glClearColor(1.0f, 0.75f, 0.5f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 
GLfloat vertices[] = { 
    0.0f, 0.0f, 0.0f, 
    20.0f, 32.0f, 0.0f, 
    10.0f, 30.0f, 0.0f 
}; 
glColor4f(0.0f, 1.0f, 0.0f, 1.0f); 
glVertexPointer(3, GL_FLOAT, 0, vertices); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); 

glBindTexture(GL_TEXTURE_2D, texture); 
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 32, 32, 0); 

Полный исходный код доступен на Bitbucket: https://bitbucket.org/amjaliks/gl2/src/b3339661650e/GL2/GL2View.m

Результат тот же. Только заполненный прямоугольник. Похоже, что с моими матрицами определенно проблема.

+0

Shoudln't вы используете glGenFramebuffersOES, glBindFramebufferOES и т. Д. ... OES функции вместо ядра? Поскольку ES 1.1 не имеет объектов Framebuffer в ядре, они доступны как расширение. –

+0

Кажется, что Apple объединила API. Нет никакой разницы в использовании методов с OES и без OES. –

+0

Что вы имеете в виду - слились? Это написано даже в документации Apple: https://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESontheiPhone/OpenGLESontheiPhone.html#//apple_ref/doc/uid/TP40008793-CH101-SW6 (Объекты Framebuffer являются единственной целью рендеринга в iOS). В GLES 1.1 вы должны использовать расширение OES_framebuffer_object. –

ответ

0

Ваша проблема с матрицами. По умолчанию матрица проекции является тождественной. Таким образом, даны координаты (-1, -1) - (+ 1, + 1) для окна просмотра. Скорее всего, вам нужна орфографическая проекция на квадрат (0,0) - (32,32).