2015-09-19 3 views
2

Мой сцена сцены - это процедурная текстура, которая рисует океан, пол лавы или какой-либо другой фон. Он также полностью распространяется и, как если бы вы были внутри cubemap. Было бы легче, если бы я мог предположить, что представление было одинаковым во всех направлениях, но если есть солнце, например, вы не можете.Как отразить сферу хром в сцене с процедурной текстурой

Теперь, если бы я хотел поставить хромированную сферу посередине, что она отражает? Сфера видит то же, что делает главная камера?

Предположим, что это очень дорого для рендеринга фона, и я не хочу делать это несколько раз за кадр. Я могу сохранить копию для использования в отражении, если это поможет.

Может кто-нибудь предложить общий подход? Вот пример процедурной текстуры я имею в виду (это не все в затенении, не геометрия, кроме четырехугольника):

https://www.shadertoy.com/view/XtS3DD

+0

Я думаю, что вы после [ (https://en.wikipedia.org/wiki/Reflection_mapping) (за исключением того, что вы должны использовать свои процедурные текстуры вместо изображения, загруженного из файла). –

ответ

1

Чтобы ответить на ваш первый вопрос: В реальном мире, отражение вы видите сфера зависит как от положения камеры, так и от положения самой сферы. Однако учет обеих позиций является слишком дорогостоящим для движущейся сферы при использовании отображения куба (наиболее распространенный подход), так как вы должны повторно отобразить все шесть граней куб-карты с каждым фреймом. Таким образом, большинство игр «поддельной» реальности, используя куб-карту, которая сосредоточена вокруг начала координат ((0, 0, 0) в мировом пространстве) и только возвращает статические объекты (деревья и т. Д.) В карту куба.

Поскольку ваш фон полностью процедурный, вы можете пропустить создание текстур кубатуры. Если вы можете определить свою процессуальную текстуру фона как функцию направления (не позиции!) Из начала координат, тогда вы можете использовать нормальный вектор каждой точки на сфере, плюс положение сферы, а также положение камеры для выборки из фоновой текстуры.

Вот формула для этого, используя некоторые GLSL псевдокод:

vec3 N = normal vector for point on sphere 
vec3 V = position of camera 
vec3 S = position of point on sphere 

vec3 ray = normalize(reflect(V-S,N)); 
// Reflect the vector pointing from the a point on the sphere to 
// the camera over the normal vector for the sphere. 

vec4 color = proceduralBackgroundFunc(ray); 

Выше color окончательный вывод затенения для точки S на поверхности сферы.

В качестве альтернативы, вы можете пререндер фон в виде кубической текстуры, а затем образец из него, как это (изменяя только последнюю строку кода из выше):

vec4 color = texture(cubeSample,ray);