Как отключить или настроить отсечение при рендеринге текстуры с использованием FBO в OpenGL? - PullRequest
0 голосов
/ 18 февраля 2011

У меня есть вопрос о том, как FBO обрезает видимую сцену.Все это происходит в iPhone OpenGL ES.

Я рендеринг в 2D и использую рендеринг в текстуру с FBO.

Я обнаружил, что когда какая-либо часть сцены проходит любую сторону прямоугольника с размером экрана (480 * 320), она кажется вырезанной из сгенерированной текстуры FBO.

Почему это происходит?Как отключить или настроить его?

Я пытался отключить тест ножниц с помощью

lDisable(GL_SCISSOR_TEST);

Я пытался чтобы настроить необходимый раздел с помощью

`glEnable(GL_SCISSOR_TEST);
glScissor(0, 0, 100, 100);`

Я пытался настроить Viewport с помощью

glViewport(0,0, 512,512);

это не такработать по мере необходимости.Вместо того, чтобы расширить область рендеринга до необходимого 512 * 512, похоже, он по-прежнему обрезает область до 480 * 320 и затем растягивает ее до 512 * 512

Все это не принесло необходимого результата.

В моем коде: я создаю текстуру

GLuint textureID;   
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);

glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);`

Создаю FBO и прикрепляю к ней текстуру

GLuint textureFrameBuffer;
GLint prevFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &prevFBO);

// create framebuffer
glGenFramebuffersOES(1, &textureFrameBuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer);

// attach renderbuffer
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, textureID, 0);

if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES)
    NSLog(@"ERROR - WHILE CREATING FBO");

// unbind frame buffer
glBindFramebufferOES(GL_FRAMEBUFFER_OES, prevFBO);

И затем, когда я рисую некоторые вещи вFBO и визуализируем квадрат с этой текстурой,

static const float textCoords[] = 
{
    0, 1,
    1, 1,
    0, 0,
    1, 0,
};

static const float quadVerts[] = 
{
    0, 320,
    320, 320,
    0, 0,
    320, 0,
};
glEnable(GL_TEXTURE_2D);    
glBindTexture(GL_TEXTURE_2D, textureID);    
glVertexPointer(2, GL_FLOAT, 0, quadVerts);
glTexCoordPointer(2, GL_FLOAT, 0, textCoords);      
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

По моему мнению, я должен увидеть квадрат, заполненный всем материалом, который я нарисовал для моего FBO.Принимая во внимание, что я вижу только его часть - обрезанный прямоугольник размером 480х320 в левом нижнем углу. Итак, вопрос стальной актуальный

1 Ответ

1 голос
/ 18 февраля 2011

Вам нужно изменить видовой экран, выполнив:

glViewport(0,0,textureWidth,textureHeight);

РЕДАКТИРОВАТЬ : и не забудьте вернуть его к своему нормальному значению после рендеринга на FBO.

/// save viewport
GLint vp[4];
glGetIntegerv(GL_VIEWPORT, vp);

/// restore viewport
glViewport(vp[0], vp[1], vp[2], vp[3]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...