Воскресенье, 24 Ноября 2024, 09:54

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Compute Shader ошибка в DDX
kokonДата: Среда, 20 Апреля 2016, 21:48 | Сообщение # 1
был не раз
Сейчас нет на сайте
Здравствуйте! Никак не могу разобраться с ddx в Compute Shader. В коде шейдера я получаю UV координату пикселя. Без проблем копируется из одной текстуры в другую, т.е. UV координаты получаются правильные. Но когда я хочу поместить их в функцию ddx(ddy) мне выдает ошибку: cannot map expression to cs_5_0 instruction set. Хотя на строку ddx(float2(1,1)) не ругается, а на ddx(uv) - ошибка. Подскажите, что нужно помещаться в эти функции.
Код

#pragma kernel CSMain

RWTexture2D<float4> texCopy;
Texture2D<float4> tex;

SamplerState _LinearClamp;

[numthreads(8,8,1)]
void CSMain (uint2 id : SV_DispatchThreadID)
{
        float w, h;
        texCopy.GetDimensions(w, h);
        float2 uv = float2(id.x/w, id.y/h);     
        float2 dx=ddx(uv);
//float2 dx=ddx(float2(1,1));
        float2 dy=ddy(uv);
        float4 t = tex.SampleGrad(_LinearClamp, uv, dx,dy);     
        texCopy[id] = t;
}
LertmindДата: Четверг, 21 Апреля 2016, 00:45 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
ddx/ddy работает только в пиксельном шейдере, это написано в документации, для примера у человека была такая же ошибка.
kokonДата: Четверг, 21 Апреля 2016, 08:57 | Сообщение # 3
был не раз
Сейчас нет на сайте
Блин, фигово. Хотел этот шейдер переделать в Compute Shader чтобы тайлинг текстуры делать не с помощью материала, а затайленную текстуру хранить в переменной и дальше с ней работать. Есть какая-нибудь альтернатива методам DDX(Y)?
Код

Shader "WangTiles/WangTiles"
{
    Properties
    {
  _TilesTexture("TilesTexture", 2D) = "white" {}
  _TileMappingTexture("TileMappingTexture", 2D) = "white" {}
  _TileMappingScale("TileMappingScale", Vector) = (0,0,0,0)
  _TileScale("TileScale", Vector) = (0,0,0,0)
  
    }
    SubShader
    {
  Tags { "RenderType"="Opaque" }
  LOD 200
  
  CGPROGRAM
  #pragma surface surf Lambert
  #pragma target 3.0
  #pragma glsl
  
  sampler2D _TilesTexture, _TileMappingTexture;
  float2 _TileMappingScale, _TileScale;
  
  struct Input
  {
   float2 uv_TilesTexture;
  };
  
  float2 mod(float2 a, float2 b)
     {
      return floor(frac(a/b)*b);
     }

  void surf (Input IN, inout SurfaceOutput o)
  {
  
   float2 uv = IN.uv_TilesTexture.xy;
    
   float2 mappingAddress = uv * _TileMappingScale;

         float2 tileScaledTex = uv * _TileMappingScale * (1.0/_TileScale);
         float4 whichTile = tex2D(_TileMappingTexture, mod(mappingAddress, _TileMappingScale)/_TileMappingScale) * 255.0;
         
         float4 result = tex2D(_TilesTexture, (whichTile.xy + frac(mappingAddress))/_TileScale, ddx(tileScaledTex), ddy(tileScaledTex));
         
   o.Albedo = result.rgb;
   o.Alpha = result.a;
   
  }
  ENDCG
    }
    FallBack "Diffuse"
}
LertmindДата: Четверг, 21 Апреля 2016, 20:19 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
Здесь http://forum.unity3d.com/threads/ddx-ddy-alternatives.79246/ Daniel Brauer ссылается на https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch25.html

Сообщение отредактировал Lertmind - Четверг, 21 Апреля 2016, 20:20
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг