Пятница, 01 Августа 2025, 23:45

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Результаты поиска
kokonДата: Четверг, 21 Апреля 2016, 08:57 | Сообщение # 1 | Тема: Compute Shader ошибка в DDX
был не раз
Сейчас нет на сайте
Блин, фигово. Хотел этот шейдер переделать в 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"
}
kokonДата: Среда, 20 Апреля 2016, 21:48 | Сообщение # 2 | Тема: Compute Shader ошибка в DDX
был не раз
Сейчас нет на сайте
Здравствуйте! Никак не могу разобраться с 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;
}
kokonДата: Среда, 28 Мая 2014, 19:50 | Сообщение # 3 | Тема: Слишком сильная инерция при повороте объекта
был не раз
Сейчас нет на сайте
Здравствуйте! Пытаюсь разобраться в скрипте полета самолета. Возникла такая проблема. Самолет вращается с помощью мышки. Когда двигаешь мышкой(даже чуть-чуть) самолет начинает вращаться слишком сильно, т.е. ему задается начальный импульс, а потом он по инерции еще проворачивается(довольно сильно). Тоже самое с движением. В итоге полет над террейном получается какой-то сумасшедший. Все крутиться и вертится. Подскажите как можно убрать или уменьшить силу инерции.
Вот процедура в которой осуществляется поворот.
Код

void FixedUpdate()  
              {  
                      if(!this.rigidbody)  
                    return;  
                      Quaternion AddRot = Quaternion.identity;  
                      Vector3 velocityTarget = Vector3.zero;                
                    AddRot.eulerAngles = new Vector3(pitch, yaw, -roll);  
                      mainRot *= AddRot;  
                  rigidbody.rotation = Quaternion.Lerp(rigidbody.rotation, mainRot, Time.fixedDeltaTime * RotationSpeed);  
                  velocityTarget = (rigidbody.rotation * Vector3.forward) *(Speed + MoveSpeed);                        
              rigidbody.velocity = Vector3.Lerp(rigidbody.velocity,velocityTarget,Time.fixedDeltaTime);             
                      yaw = Mathf.Lerp(yaw,0,Time.deltaTime);  
                      MoveSpeed = Mathf.Lerp(MoveSpeed,Speed,Time.deltaTime);         }  


Я так понимаю, что дело в строке
Код

rigidbody.rotation = Quaternion.Lerp(rigidbody.rotation, mainRot, Time.fixedDeltaTime * RotationSpeed);  

Что сам метод Lerp анимирует перевод одного кватерниона в другой. Пытался менять значение RotationSpeed, просто меняется скорость поворота, но инерция остается.
  • Страница 1 из 1
  • 1
Поиск:

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