Страница 1 из 1

Перевёрнутая картинка постэффектов.

СообщениеДобавлено: 21 июл 2016, 23:05
kripto289
Юзаю render target. Есть типичная беда, которую я давно не могу исправить.
Если добавить постэффект = перевернутая картинка.
Если добавить АА = обычная
В случае АА + постэффект = обычная.

Знаю о разнице openGL и directx и перевёрнутой картинки.
Везде советуют юзать это
#if SHADER_API_D3D9
if (_MainTex_TexelSize.y < 0)
v.texcoord.y = 1.0 - v.texcoord.y;
#endif
Что на самом странно. directx 11 и 12 пролетает.
Во вторых, я юзаю

sampler2D _GrabTextureMobile;
float4 _GrabTextureMobile_TexelSize;

Но в texelSize никогда не бывает негативного значения.

Ещё в шейдерах встречал такую конструкцию

#if UNITY_UV_STARTS_AT_TOP
float scale = -1.0;
#else
float scale = 1.0;
#endif
Тоже нифига не работает. Только корректно определяет версию directX/openGL, но ни когда висит постэффект.

Что делать?

ps Проблема на dx9/dx 11 с любым постэффектом без АА и с любым рендер модом. На мобилках с постэффектом и без - всё корректно.

Re: Перевёрнутая картинка постэффектов.

СообщениеДобавлено: 22 июл 2016, 00:41
kripto289
kripto289 писал(а):Юзаю render target. Есть типичная беда, которую я давно не могу исправить.
Если добавить постэффект = перевернутая картинка.
Если добавить АА = обычная
В случае АА + постэффект = обычная.

Знаю о разнице openGL и directx и перевёрнутой картинки.
Везде советуют юзать это
#if SHADER_API_D3D9
if (_MainTex_TexelSize.y < 0)
v.texcoord.y = 1.0 - v.texcoord.y;
#endif
Что на самом странно. directx 11 и 12 пролетает.
Во вторых, я юзаю

sampler2D _GrabTextureMobile;
float4 _GrabTextureMobile_TexelSize;

Но в texelSize никогда не бывает негативного значения.

Ещё в шейдерах встречал такую конструкцию

#if UNITY_UV_STARTS_AT_TOP
float scale = -1.0;
#else
float scale = 1.0;
#endif
Тоже нифига не работает. Только корректно определяет версию directX/openGL, но ни когда висит постэффект.

Что делать?

ps Проблема на dx9/dx 11 с любым постэффектом без АА и с любым рендер модом. На мобилках с постэффектом и без - всё корректно.


Нашёл ответ.

uv.y *= _ProjectionParams.x;
When rendering in texture coordinate (UV) space for special effects or tools, you might need to adjust your shaders so that the rendering is consistent between D3D-like and OpenGL-like systems, and between rendering into the screen vs. rendering into a texture. The built-in variable _ProjectionParams.x contains a +1 or –1 value which indicates whether projection has been flipped upside down or not. You can check this value in your shaders if you need to do different things based on this.