Перейти к содержимому


Свернуть чат Чат Открыть чат во всплывающем окне

lz : (час назад) да не, я не)
Yakim (Watco... : (20 часов назад) Егор, ты говоришь так. будто у тебя они есть, так вот, че по чем?))))
Гость : (вчера) Вот бы сейчас, в 2018, читы на мехов гуглить...
lz : (вчера) Ты просто без читов гоняешь.
Yandersen : (вчера) Ниправда, этот сукасадист должен существовать, его не может не быть! Иначе на кого тяготы жизни сваливать?
Yakim (Watco... : (вчера) Юморист от бога, которого нет)))
Гость : (вчера) Бля, я думал это поиск
Гость : (вчера) Читы
Yakim (Watco... : (6 дней назад) Ну как-бы да, насколько я помню, Дуст и Сплайн основатели =) Кажется идея Дуста, реализация Сплайна.
lz : (6 дней назад) Вон даже свалкер2 будет, а ты говоришь. И P4 будет)
Yandersen : (неделю назад) ессниошибаюсь. Якимка, подтверди?..
Yandersen : (неделю назад) Егор, кто такой Дуст надо знать. Он папа Мехов, основатель Скаев, автор оригинальной идеи и главный разраб.
lz : (неделю назад) Всё будет.
lz : (неделю назад) Я его знать не знаю, и, поэтому, как-то безразлично.
Yandersen : (неделю назад) Не, ну остается ещё пол процента вероятности что старческий маразм, который, судя по всему, уже не за горами, толкнет дедулю на кикстартер и жалкую попытку возродить легенду, но если это и случится, это будет жалкий высер и позор, тут гарантированно.
Yandersen : (неделю назад) Ну так, антипример мотивационный. Тип для подверждения утверждения о последнем Джедае в твоем лице.
Yandersen : (неделю назад) Нам? Да незачем канеш. Прост он Батя Мехов, и после многолетней череды ежегодных грез о М3 такое вот отмачивает.
lz : (неделю назад) Он нам зачем?
lz : (неделю назад) Ни тепло ни холодно.
Yandersen : (неделю назад) Так как тебе новостя, что Дуст из Партизанов в Fearea перешел? От же мотает старика из говна в навоз...
Yandersen : (неделю назад) Еще бы. У меня во времена креативные если проект десяток хидеров включал, так я с наскока в лучшем случае все с нуля тупо переписывал, чем разбирался что там где как было. В худшем - тупо закрывал и забывал нах. Ты-то молодец.
lz : (неделю назад) Я бывает открываю, но с наскока не берётся так пока.
lz : (неделю назад) Так там 3 года назад ещё всё почти готово было. Прогресса особо больше и не было. АИ надо и всё считай.
Yandersen : (неделю назад) Егор, ну позязя, там же на вид не так много осталось? Будет играбельно хоть чутка - получится мотивационно, больше шансов что кто-нить из народа подключится.
lz : (неделю назад) Занят пока просто, терпение)
Гость : (неделю назад) Лол, нет)
Yandersen : (неделю назад) Ну, вялотекущие дела - это по моей части. Ты-то как креативность растерял, а Егорка? На тебя ж одна надежда осталась. Дуст вон в Fearea влился уже. Это ж все, мехам хана, а последний из Джедаев стал вялотекущими делами заниматься, вместо того чтоб мир разумных машин от забвения спасать. Ну Егооооор... :(
lz : (3 недель назад) По гитхабу можно посмотреть.
lz : (3 недель назад) Вялотекущий режим. Время от времени чего-то смотрю.
Yandersen : (3 недель назад) Егорушка, ну а как же ремастеред?.. :(
Yakim (Watco... : (4 недель назад) бугага
lz : (4 недель назад) Вытаскивал из блока.
lz : (4 недель назад) Блэт, мои серваки на амазоне под раздачу попали.
Yakim (Watco... : (05 Апрель 2018 - 20:54) :ph34r:
Гость : (22 Март 2018 - 09:37) Благодарю :) (предпочитаю постоянный стабильный заработок)
Yakim (Watco... : (21 Март 2018 - 19:56) пхахаха
lz : (21 Март 2018 - 16:46) Может быть, хочешь знать, как поднять бабла?
lz : (21 Март 2018 - 16:46) Кстати, а проблем с доступом к джойказино у тебя нет?
lz : (21 Март 2018 - 16:02) Активировал.
Гость : (21 Март 2018 - 15:32) Проблемы с активацией аккаунта на форуме... =)
Yakim (Watco... : (19 Март 2018 - 21:37) :ph34r:
Yakim (Watco... : (01 Февраль 2018 - 21:44) ?
Yandersen : (01 Февраль 2018 - 19:04) Проблемы?..
Yakim (Watco... : (31 Январь 2018 - 13:18) Какие проблемы?
lz : (30 Январь 2018 - 16:17) Какие проблемы? Проблемы с другими движками?

Фотография
- - - - -

[Camera.hpp] - камера с реалистичными свойствами

OpenGL Camera FBO Deferred shading

  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 21 Апрель 2015 - 02:18

Класс камеры CCamera, реализующий перспективную проекцию с реалистичными свойствами (нет дальней плоскости отсечения, сверхмалая ближняя плоскость отсечения):

 

Camera.hpp

 

:!: Требует LoadGL.h, GLSL.hpp, Origin.hpp, FBO.hpp. Плюс необходима поддержка OpenGL4.5 (DSA, ARB_clip_control).

 

Кидаем файл в проект, подключаем:

#include "Camera.hpp"

Изменяем настройку glClipControl:

glClipControl(<...>, GL_ZERO_TO_ONE);

:!: С дефолтной настройкой (GL_NEGATIVE_ONE_TO_ONE) камера не будет работать корректно!

 

Каждая камера класса CCamera имеет свой собственный FBO и использует floating-point depth buffer (буффер глубины). Буффера трафарета (stencil buffer) нет. Цветовых буфферов может быть до 8. В качестве буфферов используются текстуры (создаются и удаляются классом CCamera):

GLuint CCamera::AddDepthBuffer(int Width, int Height, bool WithMipmaps = true);
GLuint CCamera::AddColorBuffer(unsigned ID, GLenum internalFormat,
                               int Width, int Height, bool WithMipmaps = true);

Width и Height - размеры требуемого буффера, флаг WithMipmaps определяет, будут ли у текстуры мипмапы (если false, то мипмапов не будет). В случае создания буффера цвета нужно указать индекс ID создаваемого буффера (0...7) и формат пикселя текстуры (значения internalFormat см. тут). Возвращённое значение - имя созданной текстуры или 0 если создать текстуру не удалось.

:!: Свойства текстуры позволяется менять (glTexPartameter), но изменять размеры или удалять - нельзя. Для удаления требуемого буффера используйте 0 в качестве аргумента Width или Height.

 

Для изменения размеров сразу всех буфферов используйте

bool CCamera::ResizeBuffers(int Width, int Height);

:!: Все свойства каждого из буфферов будут воссозданы, но имена текстур могут измениться.

Чтобы узнать имя текстуры конкретного буффера используйте

inline GLuint GetColorBufferTextureName(unsigned ID)const;
inline GLuint GetDepthBufferTextureName()const;

Эффективные размеры фреймбуффера равны минимуму размеров всех его буфферов. Узнать можно так:

inline ivec2 GetFrameSize()const;

Геометрические свойства камеры показаны на следующей схеме:

 

Camera.png

 

Используемая матрица перспективной проекции имеет следующий вид:

     | 2*zNear                      |
     | -------    0      0      0   |
     |  xSize                       |
     |         2*zNear              |
     |    0    -------   0      0   |
     |          ySize               |
 P = |                              |
     |    0       0      0    zNear |
     |                              |
     |                              |
     |    0       0     -1      0   |
     |                              |

Перспектива задаётся следующей функцией:

inline bool CCamera::SetupPerspective(float FOVy, float NearClippingPlane);

FOVy - угол обзора (по вертикали). NearClippingPlane - это расстояние до ближней плоскости отсечения (zNear на рисунке). FOVy должен быть больше 0 и меньше 180 градусов, а NearClippingPlane (zNear) - больше нуля. Геометрические размеры проекционной плоскости (xSize, ySize) будут вычислены автоматически и их отношение будет соответствовать отношению ширины и высоты фреймбуффера.

:!: При изменении размеров фреймбуффера размеры проекционной плоскости и zNear могут измениться, однако угол обзора по вертикали останется тем же.

 

Угол обзора можно менять так:

inline void CCamera::ChangeFOV(float FOVy);

Изменение угла обзора будет достигнуто за счёт приближения/удаления проекционной плоскости (изменение zNear); размеры проекционной плоскости (xSize, ySize) при этом останутся неизменными.

Узнать размеры проекционной плоскости можно так:

inline vec2 CCamera::GetPlaneSize()const;

Изменить размеры проекционной плоскости можно функцией SetPlaneSize, принимающей в качестве параметра желаемый размер проекционной плоскости - её текущие размеры будут отмасштабированы таким образом, что наибольшее из измерений станет равно заданной величине:

CCamera MyCamera;
... //Setup buffers, configure perspective
vec2 Dims = MyCamera.GetPlaneSize(); //Assume that Dims.x==640.f, Dims.y==480.f

float SquareApertureWidth = 0.01f; //Aperture has square shape, 1cm in width
MyCamera.SetPlaneSize(SquareApertureWidth);
Dims = MyCamera.GetPlaneSize(); //Dims.x==0.01f, Dims.y==0.0075f

:!: zNear при этом изменится, а угол обзора останется прежним.

 

Расстояние до проекционной плоскости (ближняя плоскость отсечения, zNear) читается так:

inline float CCamera::GetNearClippingPlane()const;

Угол обзора по диагонали всегда больше угла обзора по вертикали. Узнать его можно так:

float CCamera::GetViewAngleMax()const;

:!: Половина этого значения - это угол между высотой и образующей конуса видимости, в который вписана усечённая пирамида видимого камерой объёма.

 

Класс CCamera содержит указатель на объект класса COriginf (система координат). Ориентация камеры в пространстве привязана к ориентации системы координат Origin. Если указателя нет, то используется ориентация по-умолчанию: Ox={1,0,0}, Oy={0,1,0},Oz={0,0,1}, Center={0,0,0}.

Направление взгляда - это ось -Oz, направление направо - ось Ox, вверх - Oy. Узнать направление взгляда можно так:

inline vec3 CCamera::GetViewDirection()const;

Узнать координаты вектора, соответствующего направлению от центра координат до пикселя фреймбуффера с указанными координатами можно так:

inline vec3 CCamera::PixelToRay(const ivec2& PixelCoordinates)const;

:!: Учтите, что перед вычислением этого направления указанные координаты пикселя будут ограничены нулём, шириной и высотой фреймбуффера.

 

CCamera умеет работать с тремя матрицами:

mat4 ModelViewMatrix: трансформация из мировой системы координат в систему координат камеры (поворот, смещение);

mat4 ProjectionMatrix: из системы координат камеры в проеционное пространство (проекция);

mat4 TransformationMatrix: из мировой системы координат в проекционное пространство (поворот, смещение, проекция).

А также соответствующими им обратными матрицами ModelViewMatrixInverse, ProjectionMatrixInverse, TransformationMatrixInverse.

Конструируют эти матрицы следующие функции класса:

//Return ModelView matrix
inline mat4 CCamera::GetModelViewMatrix()const;
//Return Inverse of the ModelView matrix
inline mat4 CCamera::GetModelViewMatrixInverse()const;
//Return the Projection matrix
mat4 CCamera::GetProjectionMatrix()const;
//Return inverse of the Projection matrix
mat4 CCamera::GetProjectionMatrixInverse()const;
//Return the full transformation matrix
inline mat4 CCamera::GetTranformationMatrix()const;
//Return inverse of the full transformation matrix
inline mat4 CCamera::GetTranformationMatrixInverse()const;

Перенаправляем рендер во фреймбуффер требуемой камеры так:

inline void CCamera::StartCapturing()const;

Очистка буфферов:

//Clear one of the color buffers (it's index is specified as BufferID); color
//must be specified as vec4, ivec4 or uvec4
template<class T>
inline void CCamera::ClearColorBuffer(unsigned int ID, const T& tvecRGBA);
//Clear all of the color buffers simultaneously with the same value
inline void CCamera::ClearColorBuffers(const vec4& vecRGBA){ FBO.ClearColor(vecRGBA); }
//Clear the depth buffer
inline void CCamera::ClearDepthBuffer(GLfloat Value=0.f){ FBO.ClearDepth(Value); }
//Clear all of the color buffers and the depth buffer
inline void CCamera::ClearBuffers(const vec4& ColorRGBA, float Depth=0.f);

По оканчании рендера скопировать картинку на экран можно с помощью этой функции:

inline void CCamera::ShowFrame(unsigned ColorBufferID=0,
                               GLint ScreenWidth=0, GLint ScreenHeight=0)const;

Тут ColorBufferID - индекс буффера цвета, в котором находится желаемое изображение. ScreenWidth, ScreenHeight - размеры экрана: если указаны (отличны от нуля), то картинка будет растянута/сжата под размер экрана; если же размер экрана не указан, то копирование пойдёт пиксель-в-пиксель, и если размеры фреймбуффера камеры и экрана не равны, картинка либо обрежется, либо не замостит весь экран.







Темы с аналогичным тегами OpenGL, Camera, FBO, Deferred shading

Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных