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

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

Страницы: 1 2 Следующая »
#0
18:10, 29 дек. 2017

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

Вот пример:

+ Показать

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

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

+ Показать

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


#1
19:58, 29 дек. 2017

Никому не приходилось делать шейдер, который пишет значения глубины в _CameraDepthTexture, основываясь на текстуре?

#2
23:12, 29 дек. 2017

Скачай Shader Forge. Он свои ноды собирает как раз во фрагментые шейдеры. Там и подсмотри как правильно делать.

#3
3:30, 30 дек. 2017

может железо не поддерживает? пробовал на другом устройстве?

#4
4:29, 30 дек. 2017

Alerr
> Почему depth не передается в DepthTexture?
А как ты используешь данный шейдер? Например если использовать drawmeshnow или drawprocedural в OnRenderObject то это происходит после того как текстура глубины будет сформирована. Поэтому любая запись в буфер глубины не будет отображаться в текстуре.

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

#5
11:59, 30 дек. 2017

Chupakaber
> может железо не поддерживает? пробовал на другом устройстве?
Пробовал, но у меня небольшое разнообразие железа.

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

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

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

#6
14:35, 10 янв. 2018

Что-то в таком виде

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;
}
#7
16:45, 10 янв. 2018

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 оно почему-то не влияет.

#8
17:08, 10 янв. 2018

гугл говорит что вот так:

struct fragOut
{
  half4 color : SV_Target;
  float depth : SV_Depth;
};
#9
19:23, 10 янв. 2018

Durane
> гугл говорит что вот так:
> struct fragOut
> {
> half4 color : SV_Target;
> float depth : SV_Depth;
> };

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

#10
19:24, 10 янв. 2018

Durane
Подозреваю, что возможно запись в буффер глубины и идет, но вот _CameraDepthTexture (на сколько понимаю) это не буффер глубины и сюда Unity почему-то ничего не пишет.

#11
11:43, 11 янв. 2018

А в настройках проекта в КResolution and Presentation не стоит галочка Disable Depth and Stencil?

#12
15:33, 11 янв. 2018

Durane
> А в настройках проекта в КResolution and Presentation не стоит галочка Disable Depth and Stencil?

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

+ Показать

#13
17:37, 11 янв. 2018

depth pre-pass

#14
17:51, 11 янв. 2018

Dampire
> depth pre-pass

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

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

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