OpenGL: Как оптимизировать 2D-рендеринг с несколькими слоями, перекрывающими друг друга в 3D-режиме? - PullRequest
2 голосов
/ 06 июня 2011

Я знаю, как ускорить рендеринг в 3d путем простого рендеринга ближайших самолетов.

Но как мне воспользоваться преимуществами этого метода в режиме 2d? Я не могу использовать глубинное тестирование, потому что все они находятся на одном и том же z-уровне.

Так что я подумал, может ли это быть ускорено, когда мне не нужно рендерить невидимые части слоев "ниже". Возможно ли это?

Обратите внимание, что я выполняю рендеринг в режиме 3D, одновременно могут быть 3D-объекты и 2-D объекты. Так что я не могу переключиться только на 2D рендеринг, я всегда использую 3D-координаты для всего. И я могу поворачивать камеру по своему желанию, поэтому приемы, специфичные для камеры, неприемлемы.

Редактировать: Я попробовал метод, предложенный Вилле: enter image description here

(http://img815.imageshack.us/img815/7857/zfighting.png)

но, как вы видите, это приведет к z-бою.

Код, который я использовал для рендеринга:

glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);
glDisable(GL_ALPHA_TEST);
glDisable(GL_POLYGON_OFFSET_FILL);

glColor4f(1,0,0,1);
DrawQuad(0, 0, 10, 10);

glColor4f(0,0,1,1);
DrawQuad(5, 5, 15, 15);

glDepthFunc(GL_LEQUAL);

Ответы [ 2 ]

1 голос
/ 06 июня 2011

Звучит так, как будто вы визуализируете все свои "2D" объекты на одной плоскости.Вы можете визуализировать ваши 2D детали в неэкранный кадровый буфер с ортогональной проекцией и дать им разные значения Z, как предложил datenwolf.Затем визуализируйте текстуру кадрового буфера в вашей главной 3D-сцене.

1 голос
/ 06 июня 2011

Что вы понимаете под 2D режимом? Вы имеете в виду орфографическую проекцию? Тогда у меня есть хорошие новости: там также отлично работает глубинное тестирование. gluOrtho2D в основном такой же, как и glOrtho (..., -1, 1); то есть у вас есть Z диапазон -1 ... 1, чтобы потратить.

РЕДАКТИРОВАТЬ из-за комментария:

Вполне возможно комбинировать рендеринг нескольких проекций в одном кадре:

void render_perspective_scene(void);

void render_ortho_scene(void);

void render_HUD();

void display()
{
    float const aspect = (float)win_width/(float)win_height;

    glViewport(0,0,win_width,win_height);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-aspect*near/lens, aspect*near/lens, -near/lens, near/lens, near, far);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    render_perspective_scene();

    // just clear the depth buffer, so that everything that's
    // drawn next will overlay the previously rendered scene.
    glClear(GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-aspect*scale, aspect*scale, -scale, scale, 0, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    render_ortho_scene();

    // Same for the HUD, only that we render
    // that one in pixel coordinates.
    glClear(GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, win_width, 0, win_height, 0, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    render_HUD();
}

Конечно, если вы влюбились в те плохие учебники, которые помещают настройку матрицы проекции в обработчик изменения формы, вы, конечно, заблокированы, чтобы увидеть это очевидное решение.

...