2014-11-13 4 views
0

Я использую FBO, и мне нужно отобразить часть экрана текстуре. Мне нужно ограничить полноэкранный рендеринг, поэтому я получаю только небольшое окно экрана, отображаемого в текстуре (затем я размычу эту часть и отрисую ее обратно на экран в виде текстуры).opengl es render часть экрана текстуре

Проблема в том, что я немного застрял в том, что делать с матрицей просмотра, перспективы и просмотра. Может ли кто-нибудь помочь?

+0

Это почти точный дубликат http://stackoverflow.com/questions/24310536/opengl-render-portion-of-screen-to-texture/. Вы можете проверить ответы там. Я не могу официально назначить это как дуп, потому что ни один из ответов не был одобрен. Мой ответ там предлагает более простое решение, которое не требует каких-либо модификаций перспективных и видных матриц. –

ответ

0

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

После того, как вы создали FBO соответствующего размера (возможно, нужны размеры POT), вам необходимо установить видовое окно так же, как размер участка, который вы перерисовываете, а начало координат находится на (0,0). Следующее, что вам нужно изменить, это проекционная часть матрицы, которая в большинстве случаев либо glOrtho, либо glFrustum. Оба они имеют 4 параметра границы (слева, справа, сверху, снизу). Эти параметры должны быть установлены в той части сцены, которую вы перерисовываете, которая зависит от того, как вы устанавливаете параметры границы на главной сцене, так и в какой системе координат задается ваш перерисованный прямоугольник. Например, если вы хотите перерисовать верхнюю левую часть экрана 100x100 и использовать glOrtho и параметры границы как (0,0,viewWidth,viewHeight), то ваши новые параметры границы просто (0,0,100,100). Но если вы используете что-то вроде (-1,-1,1,1), тогда эти параметры нужно будет вычислить в зависимости от размера вашего экрана (буфера).

В любом случае, вы должны иметь возможность управлять им, изменяя только эти 2 метода. Не забудьте перезагрузить их после того, как вы закончите рисование в FBO.

EDIT: Преобразование координат системы

Хотя это было отвечено довольно много более, чем несколько раз здесь немного математики кода для преобразования из одной системы координат в другую. Обычно вставляя свои истинные параметры из исходной сцены, это должно дать вам измененные параметры границы, которые вы должны вставить в свой усеченный FBO.

(я не проверял это так ошибки могут быть сделаны)

BorderParameters screenRect; // for instance (0, 0, 360, 480) (left, top, right, bottom) 
    BorderParameters redrawRect; // for instance (0, 0, 36, 48) (left, top, right, bottom) 
    BorderParameters frustumRect; // for instance (-1, ratio, 1, -ratio) (left, top, right, bottom) 

    BorderParameters outputRect; // result (insert into ortho or frustum) 

    outputRect.left = frustumRect.left + ((redrawRect.left-screenRect.left)/(screenRect.right-screenRect.left))*(frustumRect.right-frustumRect.left); 
    // -1 + ((0-0)/(360-0))*(1+1) = -1 
    outputRect.right = frustumRect.left + ((redrawRect.right-screenRect.left)/(screenRect.right-screenRect.left))*(frustumRect.right-frustumRect.left); 
    // -1 + ((36-0)/(360-0))*(1+1) = -.8 
    outputRect.bottom = frustumRect.top + ((redrawRect.bottom-screenRect.top)/(screenRect.bottom-screenRect.top))*(frustumRect.bottom-frustumRect.top); 
    // ratio + ((48-0)/(480-0))*(-ratio-ratio) = ratio - .2*ratio = .8*ratio 
    outputRect.top = frustumRect.top + ((redrawRect.top-screenRect.top)/(screenRect.bottom-screenRect.top))*(frustumRect.bottom-frustumRect.top); 
    // ratio + ((0-0)/(480-0))*(-ratio-ratio) = ratio 

Я вроде 50% уверен, что вся эта процедура будет работать с усеченной теперь, когда я думаю об этом, но, может быть небольшое смещение на перерисованной части (если у нее большая проблема с параметрами). В любом случае, более обычное рисовать всю сцену в FBO, а затем перерисовывать ее в основной буфер с последующей обработкой, а не перерисовывать все элементы до небольшого FBO, так как может быть много элементов для перерисовки в FBO. Также, что произойдет, если вы хотите, чтобы многие (10, например) небольшие части экрана были размытыми в одно и то же время, вы будете перерисовывать всю сцену 11 раз, чтобы получить сцену плюс 10 FBOs?

+0

Очень, очень полезно спасибо. Я делаю больше исследований, например здесь: http: //www.songho.ca/opengl/gl_transform.html#example2. Как вычислить требуемый glFrustrum из координаты экрана области, которую я хочу отобразить в буфер? – user3725725

+0

Проверьте изменения –

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