Войти
ПрограммированиеФорумГрафика

Unity: почему постобработанная картинка рисуется вверх ногами?

#0
12:02, 22 июня 2018

Привет всем.
Начал тестировать игру на разных платформах, обнаружил что при использовании OpenGL4.1 постобработанная картинка рисуется как надо.
В вершинном шейдере прописано:

#if UNITY_UV_STARTS_AT_TOP
     o.uv.y = 1.0 - o.uv.y;
#endif

При запуске игры на Windows с directX_11 картинка нарисовалась вверх ногами.
По идее, на сколько вычитал из мануалов, UNITY_UV_STARTS_AT_TOP должна решить проблему, но как вижу на деле - что-то идет не так.

Пара тестов показли, что #if UNITY_UV_STARTS_AT_TOP на OpenGL всегда выдает false, а на directX всегда true.

Вопрос в следующем: как как повернуть картинку так чтобы везде она рисовалась корректно?


#1
12:07, 22 июня 2018
#if UNITY_UV_STARTS_AT_TOP
if (_MainTex_TexelSize.y < 0)
        o.uv.y = 1 - o.uv.y;
#endif
#2
12:15, 22 июня 2018

Alerr
На directx и opengl по разному развертка UV. Не могу сказать точно вечно путаю. У одного API с верхнего левого угла(кажется у Directx) координата 0,0 у другого с нижнего левого(соответственно OpenGL)

#3
12:21, 22 июня 2018

mahrizh
> #if UNITY_UV_STARTS_AT_TOP
> if (_MainTex_TexelSize.y < 0)
> o.uv.y = 1 - o.uv.y;
> #endif
Это помогло, спасибо.

#4
12:36, 22 июня 2018

Alerr
> Пара тестов показли, что #if UNITY_UV_STARTS_AT_TOP на OpenGL всегда выдает
> false, а на directX всегда true.
> При запуске игры на Windows с directX_11 картинка нарисовалась вверх ногами.
А что будет, если #if/#endif закомментировать и использовать одинаковый код на обеих платформах?

#5
12:44, 22 июня 2018
А что будет, если #if/#endif закомментировать и использовать одинаковый код на обеих платформах?

Vulkan API :)
#6
13:26, 22 июня 2018

IBets
> а directx и opengl по разному развертка UV
Не развёртка, а система координат. OpenGL взял за основу алгебраическую систему координат или как она правильно называется. Вообщем когда точка отсчёта находится в левом нижнем углу, X вверх, Y вправо, а Z вперёд. Но конкретно для трёхмерной визуализации это оказалось совсем неудобно. Поэтому большинство в своих движках переиначивает систему координат на более привычную. А в DX уже по дефолту так сделано. Но там вроде можно настроить.

#7
13:57, 22 июня 2018

g-cont
Ну ты понял что я имел ввиду. Ну все же там сложнее. У нас есть NDC то есть декартово произведение [-1,1]x[-1,1]x[0,1] в DX, [-1,1]x[-1, 1], [-1,1] в GL. Коодинаты которые не попадают в данные множества осекаются(На самом деле все сложнее если у нас на экране две точки треугольника, а другая нет то нужно создать несколько). Потом растеризация хотя она может содержать и предыдущий пункт. UV - коодинаты это как мы будем обращаться к текстуре. Понятие лево и право строней системы координат ты сам вводишь. Смотря как у тебя будет определено векторное произведение

#8
14:03, 22 июня 2018

Delfigamer
> А что будет, если #if/#endif закомментировать и использовать одинаковый код на обеих платформах?
Везде картинка перевернута.

#9
14:16, 22 июня 2018

Alerr
> Везде картинка перевернута.
Ну тогда вместе с директивами убери и
> o.uv.y = 1.0 - o.uv.y;
и будет тебе ништяк.
Или это слишком правильное решение, и нужно обязательно всё делать через одно место?

#10
16:14, 22 июня 2018

IBets
не трогай NDC вообще, он везде одинаковый. Потом уже, после трансформации в экранные сделаешь height - y один раз и всё.

#11
22:45, 22 июня 2018

g-cont
У GL глубина через жопу

ПрограммированиеФорумГрафика

Тема в архиве.