Четверг, 21 Ноября 2024, 22:04

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Вершинный шейдер
zhuravelsvДата: Четверг, 26 Июля 2018, 14:50 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Можно ли с помощью вершинного шейдера сделать перемещение mesh'a в пространстве? (например так: юнити (да и вообще любой другой движок) как-то передаёт в шейдер какие-то параметры, что если сделать параметр к примеру Offset и туда передавать координаты mesh'a в пространстве, и соответственно этот шейдер будет смещать координаты каждой точки на это значение)

То есть собственно что я хочу: один раз скопировать вершини в буффер и дальше рендерить их и не пересчитывать каждый раз координаты на CPU когда объект перемещается

Сори за возможно глупый вопрос, недавно в качестве хобби начал изучать opengl посредством OpenTK, и пока мало в этом разбираюсь (с шейдерами до этого вообще никак и никогда не работал).
NoterstoneДата: Четверг, 26 Июля 2018, 15:39 | Сообщение # 2
участник
Сейчас нет на сайте
zhuravelsv, Просто изначально один раз передай матрицу модели в шейдер (при первоначальной загрузке сцены или передачи параметра изначально при загрузке модели в буфер) а при изменении уже передавай в шейдер вектор на который ты меняешь положение модели. А если не хочется делать translate на CPU - напиши функцию в шейдере для итеративного перемещения (или что тебе нужно). Просто пересчитывай матрицу модели этой функцией когда тебе нужно и подставляй результат в MVP, где M - та самая матрица для твоей модели.

Сообщение отредактировал Noterstone - Четверг, 26 Июля 2018, 15:41
BADCOIQДата: Четверг, 26 Июля 2018, 16:09 | Сообщение # 3
Отец-основатель BADCOIQ Corporation © 2010
Сейчас нет на сайте
Меши так и перемещаются.

Матрица модели(точнее объекта который визуализирует модель) (так называемая мировая матрица) это есть матрица перемещения * матрица вращения * матрица масштаба, и её надо обновлять постоянно как что-то изменилось (изменили масштаб, ориентацию или позицию).

На CPU нужно вычислить WVP, потому что на GPU эти вычисления будут идти на каждую вершину, а вершин очень много.
Код

Matrix4  W = GetWorldMatrix();
Matrix4  V = GetViewMatrix();
Matrix4  P = GetProjectionMatrix();
Matrix4  WVP = P * V * W;
посылаем в шейдер WVP


Шейдер
Код

#version 330 core
layout(location = 0) in vec3 lay_position;
void main(){
    gl_Position = WVP * vec4( lay_position, 1.0f ); // перемещаем текущую вершину на нужную позицию
}


"Do you think we can fly?
Well, I do."


Сообщение отредактировал BADCOIQ - Четверг, 26 Июля 2018, 16:17
zhuravelsvДата: Четверг, 26 Июля 2018, 16:15 | Сообщение # 4
почетный гость
Сейчас нет на сайте
ок, понял, спасибо за ответы
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг