Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Unity: Как писать в DepthTexture с помощью фрагментного?

Unity: Как писать в DepthTexture с помощью фрагментного?

Страницы: 1 2 Следующая »
AlerrПостоялецwww29 дек. 201718:10#0
Привет всем!
Нужно писать в DepthTexture информацию глубины обьекта, которая основывается на маске-текстуре.
Это получилось сделать с помощью Surface - шейдера.
В surface-шейдере это делается с помощью:
clip(maskValue - _Burn);

Вот пример:

+ Показать

Пример находится здесь: https://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html

А вот писать в DepthTexture не surface-шейдером не получается, пробовал кучу вариантов, вот этот уж точно должен работать, но не работает:

+ Показать

Почему depth не передается в DepthTexture?

Правка: 29 дек. 2017 18:10

AlerrПостоялецwww29 дек. 201719:58#1
Никому не приходилось делать шейдер, который пишет значения глубины в _CameraDepthTexture, основываясь на текстуре?
marggobПостоялецwww29 дек. 201723:12#2
Скачай Shader Forge. Он свои ноды собирает как раз во фрагментые шейдеры. Там и подсмотри как правильно делать.
ChupakaberПостоялецwww30 дек. 20173:30#3
может железо не поддерживает? пробовал на другом устройстве?
foxesПостоялецwww30 дек. 20174:29#4
Alerr
> Почему depth не передается в DepthTexture?
А как ты используешь данный шейдер? Например если использовать drawmeshnow или drawprocedural в OnRenderObject то это происходит после того как текстура глубины будет сформирована. Поэтому любая запись в буфер глубины не будет отображаться в текстуре.

Опять же у тебя разные теги Tags { "Queue" = "Geometry" } и Tags { "RenderType" = "Opaque" }
может не хватало RenderType

Правка: 30 дек. 2017 4:44

AlerrПостоялецwww30 дек. 201711:59#5
Chupakaber
> может железо не поддерживает? пробовал на другом устройстве?
Пробовал, но у меня небольшое разнообразие железа.

foxes
> А как ты используешь данный шейдер? Например если использовать drawmeshnow или drawprocedural в OnRenderObject то это происходит после того как текстура глубины
> будет сформирована. Поэтому любая запись в буфер глубины не будет отображаться в текстуре.
Я его просто цепляю на материал, как Standard-шейдер, который почему-то работает с буффером глубины, во всяком случае clip у него работает.

> Опять же у тебя разные теги Tags { "Queue" = "Geometry" } и Tags { "RenderType" = "Opaque" }
> может не хватало RenderType
Попробовал, не помогло.

Искал в сети что-то типа того, что я хочу сделать: писать в _CameraDepthTexture откорректированные значения глубины, но так ничего и не нашел.

DuraneПостоялецwww10 янв. 201814:35#6
Что-то в таком виде
float near = 1.0;
float far = 1000000.0;

struct fragOut
{
  half4 color : COLOR;
  float depth : DEPTH;
};

fragOut frag(in v2f i)
{  
   fragOut o;

  o.color = tex2D(_MainTex, i.uv);
  o.depth = (log(near * i.position.z + 1) / log(near * far + 1) * i.position.w);
               
  return o;
}
AlerrПостоялецwww10 янв. 201816:45#7
Durane
Спасибо за ответ.
Собрал шейдер:
Properties{
        _MainTex("_MainTex", 2D)="black"
    }
  SubShader
  {
    // No culling or depth
    //Cull Off
        ZWrite On
        ZTest Less

    Pass
    {
      CGPROGRAM
      #pragma vertex vert
      #pragma fragment frag
      
      //#include "UnityCG.cginc"

            sampler2D _MainTex;

      struct appdata
      {
        float4 vertex : POSITION;
        float2 uv : TEXCOORD0;
      };

      struct v2f
      {
        float2 uv : TEXCOORD0;
        float4 position : SV_POSITION;
      };

      v2f vert (appdata v)
      {
        v2f o;
        o.position = UnityObjectToClipPos(v.vertex);
        o.uv = v.uv;
        return o;
      }

            float near = 1.0;
            float far = 1000000.0;

            struct fragOut
            {
              half4 color : COLOR;
              float depth : DEPTH;
            };

            fragOut frag(in v2f i)
            {  
              fragOut o;

              o.color = tex2D(_MainTex, i.uv).rrrr;
              o.depth = 1;//(log(near * i.position.z + 1) / log(near * far + 1) * i.position.w);
                           
              return o;
            }
      ENDCG
    }
  }

    //FallBack "VertexLit"

Unity похоже вобще "по барабану" на o.depth. В _CameraDepthTexture ничего не пишется. Когда прописываю FallBack "VertexLit", то _CameraDepthTexture содержит значения глубины.  В o.depth можно присваивать хоть что, на _CameraDepthTexture оно почему-то не влияет.

DuraneПостоялецwww10 янв. 201817:08#8
гугл говорит что вот так:
struct fragOut
{
  half4 color : SV_Target;
  float depth : SV_Depth;
};
AlerrПостоялецwww10 янв. 201819:23#9
Durane
> гугл говорит что вот так:
> struct fragOut
> {
> half4 color : SV_Target;
> float depth : SV_Depth;
> };

И так тоже не работает.

AlerrПостоялецwww10 янв. 201819:24#10
Durane
Подозреваю, что возможно запись в буффер глубины и идет, но вот _CameraDepthTexture (на сколько понимаю) это не буффер глубины и сюда Unity почему-то ничего не пишет.
DuraneПостоялецwww11 янв. 201811:43#11
А в настройках проекта в КResolution and Presentation не стоит галочка Disable Depth and Stencil?
AlerrПостоялецwww11 янв. 201815:33#12
Durane
> А в настройках проекта в КResolution and Presentation не стоит галочка Disable Depth and Stencil?

У меня нет этого пункта вообще:

+ Показать

DampireПостоялецwww11 янв. 201817:37#13
depth pre-pass
AlerrПостоялецwww11 янв. 201817:51#14
Dampire
> depth pre-pass

Не понял что вы хотели сказать этим. Добавить еще pass? Добавил, не работает.

+ Показать
Страницы: 1 2 Следующая »

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

2001—2018 © GameDev.ru — Разработка игр