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

Blur при прицеливании

СообщениеДобавлено: 08 фев 2010, 21:16
WebWolf
Как сделать Blur при прицеливании что бы он размывал только то что по вокруг)) а то что в центре т.е прицел был четким... или просто размывать тупо оружие..

Re: Blur при прицеливании

СообщениеДобавлено: 08 фев 2010, 23:02
gnoblin
На оф.форуме вроде бы где-то лежал пост-эффект radial blur.

Re: Blur при прицеливании

СообщениеДобавлено: 09 фев 2010, 10:30
romeo_ftv
Смотри шейдер тут - http://forum.unity3d.com/viewtopic.php?t=39780, в нем много всего намешано, но есть и опция включающая радиальный блюр

Re: Blur при прицеливании

СообщениеДобавлено: 10 фев 2010, 16:42
warr11r
Нет, есть шейдер нормальный, только радиальный блур делает.
Но я под него скрипт подправлял, чтобы он от скорости камеры зависел.
То есть некоторые строки в скрипте нужно убрать.
Если не забуду, часиков через восемь у меня будет возможность, то загружу.

Re: Blur при прицеливании

СообщениеДобавлено: 11 фев 2010, 02:14
warr11r
radialBlur.shader

Код: Выделить всё
Shader "Hidden/radialBlur" {
Properties {
   _MainTex ("Input", RECT) = "white" {}
   _BlurStrength ("", Float) = 0.5
   _BlurWidth ("", Float) = 0.5
}
   SubShader {
      Pass {
         ZTest Always Cull Off ZWrite Off
         Fog { Mode off }
       
   CGPROGRAM
   
   #pragma vertex vert_img
   #pragma fragment frag
   #pragma fragmentoption ARB_precision_hint_fastest

   #include "UnityCG.cginc"

   uniform samplerRECT _MainTex;
   uniform half _BlurStrength;
   uniform half _BlurWidth;
   uniform half _iWidth;
   uniform half _iHeight;

   half4 frag (v2f_img i) : COLOR {
      half4 color = texRECT(_MainTex, i.uv);
       
      // some sample positions
      half samples[10] = half[](-0.08,-0.05,-0.03,-0.02,-0.01,0.01,0.02,0.03,0.05,0.08);
       
      //vector to the middle of the screen
      half2 dir = 0.5 * half2(_iHeight,_iWidth) - i.uv;
       
      //distance to center
      half dist = sqrt(dir.x*dir.x + dir.y*dir.y);
       
      //normalize direction
      dir = dir/dist;
       
      //additional samples towards center of screen
      half4 sum = color;
      for(int n = 0; n < 10; n++)
      {
         sum += texRECT(_MainTex, i.uv + dir * samples[n] * _BlurWidth * _iWidth);
      }
       
      //eleven samples...
      sum *= 1.0/11.0;
       
      //weighten blur depending on distance to screen center
      half t = dist * _BlurStrength / _iWidth;
      t = clamp(t, 0.0, 1.0);
       
      //blend original with blur
      return mix(color, sum, t);
   }
   ENDCG
      }
   }
}


RadialBlur.cs (c#)

Код: Выделить всё
using UnityEngine;

[ExecuteInEditMode]
public class RadialBlur : MonoBehaviour
{
    public Shader rbShader;
   
    public float blurStrength = 0.0f;
    public float blurWidth = 0.7f;

    private Material rbMaterial = null;
    private bool isOpenGL;

    private Material GetMaterial()
    {
        if (rbMaterial == null)
        {
            rbMaterial = new Material(rbShader);
            rbMaterial.hideFlags = HideFlags.HideAndDontSave;
        }
        return rbMaterial;
    }

    void Start()
    {
        if (rbShader == null)
        {
            Debug.LogError("shader missing!", this);
        }
        isOpenGL = SystemInfo.graphicsDeviceVersion.StartsWith("OpenGL");
    }
   
       void LateUpdate()
    {
   blurStrength = camera.velocity.magnitude * 0.03f;
   }
   

    void OnRenderImage(RenderTexture source, RenderTexture dest)
    {
        //If we run in OpenGL mode, our UV coords are
        //not in 0-1 range, because of the texRECT sampler
        float ImageWidth = 1;
        float ImageHeight = 1;
        if (isOpenGL)
        {
            ImageWidth = source.width;
            ImageHeight = source.height;
        }

        GetMaterial().SetFloat("_BlurStrength", blurStrength);
        GetMaterial().SetFloat("_BlurWidth", blurWidth);
        GetMaterial().SetFloat("_iHeight",ImageWidth);
        GetMaterial().SetFloat("_iWidth", ImageHeight);
        ImageEffects.BlitWithMaterial(GetMaterial(), source, dest);
    }
}


Пожалуйста.

Re: Blur при прицеливании

СообщениеДобавлено: 11 фев 2010, 13:18
WebWolf
Сделал спасибо)) но это конечно не то что надо)) хотя подходит... в общем щас демку скину посмотрите)
HTML код для вашего блога :
Код: Выделить всё
<script language='javascript' type="text/javascript"> document.write("<iframe marginheight='0' src='http://unity3d.ru/distribution/player.php?url=http://newssoftware.pnz.ru/Zombies.unity3d&w=800&h=600&t=true&preview=1' height='"+(600+30)+"' width='800' frameborder='0' scrolling='no'></iframe>"); </script>


Он больше подходит для гонок, как в NFS размытие. Тут надо просто заблюрить и все))) как в Crysis что бы было понятнее..
Вот скрины смотри по краям экрана и на оружии))
Скрытый текст:
Изображение
Изображение

Re: Blur при прицеливании

СообщениеДобавлено: 11 фев 2010, 14:08
Neodrop
А чего автомат влево куда то лупит?
Приятненько так с блюром. :-?

Re: Blur при прицеливании

СообщениеДобавлено: 11 фев 2010, 14:15
WebWolf
Neodrop писал(а):А чего автомат влево куда то лупит?
Приятненько так с блюром. :-?

Да есть немного)) И ещё можно самого себя застрелить))) если рядом с чем нибудь стоишь... да надо избавлятся от этого
if (hit.rigidbody){hit.rigidbody.AddForceAtPosition(force * direction, hit.point);}

хрень полная.. надо просто пульки из центра выпускать и делать что бы что нибудь летело сверкающее)) а то код что выше, рандомит неподетски... может есть что нибудь нормально написанное? )) Или подходящее?
Да и решения как избавится от того что бы оружие не проваливалось тоже не найдено(((

Re: Blur при прицеливании

СообщениеДобавлено: 05 окт 2011, 00:44
artk
А для Free версии подойдет?

Re: Blur при прицеливании

СообщениеДобавлено: 06 окт 2011, 20:22
Avatarchik
Нет,так как используется рендер в текстуру. :-B

Re: Blur при прицеливании

СообщениеДобавлено: 08 янв 2013, 10:26
JIeo_NEED
Скрытый текст:
warr11r писал(а):radialBlur.shader

Код: Выделить всё
Shader "Hidden/radialBlur" {
Properties {
   _MainTex ("Input", RECT) = "white" {}
   _BlurStrength ("", Float) = 0.5
   _BlurWidth ("", Float) = 0.5
}
   SubShader {
      Pass {
         ZTest Always Cull Off ZWrite Off
         Fog { Mode off }
       
   CGPROGRAM
   
   #pragma vertex vert_img
   #pragma fragment frag
   #pragma fragmentoption ARB_precision_hint_fastest

   #include "UnityCG.cginc"

   uniform samplerRECT _MainTex;
   uniform half _BlurStrength;
   uniform half _BlurWidth;
   uniform half _iWidth;
   uniform half _iHeight;

   half4 frag (v2f_img i) : COLOR {
      half4 color = texRECT(_MainTex, i.uv);
       
      // some sample positions
      half samples[10] = half[](-0.08,-0.05,-0.03,-0.02,-0.01,0.01,0.02,0.03,0.05,0.08);
       
      //vector to the middle of the screen
      half2 dir = 0.5 * half2(_iHeight,_iWidth) - i.uv;
       
      //distance to center
      half dist = sqrt(dir.x*dir.x + dir.y*dir.y);
       
      //normalize direction
      dir = dir/dist;
       
      //additional samples towards center of screen
      half4 sum = color;
      for(int n = 0; n < 10; n++)
      {
         sum += texRECT(_MainTex, i.uv + dir * samples[n] * _BlurWidth * _iWidth);
      }
       
      //eleven samples...
      sum *= 1.0/11.0;
       
      //weighten blur depending on distance to screen center
      half t = dist * _BlurStrength / _iWidth;
      t = clamp(t, 0.0, 1.0);
       
      //blend original with blur
      return mix(color, sum, t);
   }
   ENDCG
      }
   }
}


RadialBlur.cs (c#)

Код: Выделить всё
using UnityEngine;

[ExecuteInEditMode]
public class RadialBlur : MonoBehaviour
{
    public Shader rbShader;
   
    public float blurStrength = 0.0f;
    public float blurWidth = 0.7f;

    private Material rbMaterial = null;
    private bool isOpenGL;

    private Material GetMaterial()
    {
        if (rbMaterial == null)
        {
            rbMaterial = new Material(rbShader);
            rbMaterial.hideFlags = HideFlags.HideAndDontSave;
        }
        return rbMaterial;
    }

    void Start()
    {
        if (rbShader == null)
        {
            Debug.LogError("shader missing!", this);
        }
        isOpenGL = SystemInfo.graphicsDeviceVersion.StartsWith("OpenGL");
    }
   
       void LateUpdate()
    {
   blurStrength = camera.velocity.magnitude * 0.03f;
   }
   

    void OnRenderImage(RenderTexture source, RenderTexture dest)
    {
        //If we run in OpenGL mode, our UV coords are
        //not in 0-1 range, because of the texRECT sampler
        float ImageWidth = 1;
        float ImageHeight = 1;
        if (isOpenGL)
        {
            ImageWidth = source.width;
            ImageHeight = source.height;
        }

        GetMaterial().SetFloat("_BlurStrength", blurStrength);
        GetMaterial().SetFloat("_BlurWidth", blurWidth);
        GetMaterial().SetFloat("_iHeight",ImageWidth);
        GetMaterial().SetFloat("_iWidth", ImageHeight);
        ImageEffects.BlitWithMaterial(GetMaterial(), source, dest);
    }
}




Ребят, уже не работает...
Не могу понять, в чем причина, т.к. с шейдерами раньше не общался.

Помогите, пожалуйста!

Две ошибки:
Синтаксис:
  1. Shader error in 'Hidden/radialBlur': Shader program had errors at line 16 
  2.  
  3. Shader error in 'Hidden/radialBlur': Program 'frag', ambiguous overloaded function reference "mix(half4, half4, half)" at line 61 
  4. Keywords:  

Re: Blur при прицеливании

СообщениеДобавлено: 08 янв 2013, 14:16
seaman
Замените mix на lerp

Re: Blur при прицеливании

СообщениеДобавлено: 22 окт 2014, 15:12
Zaic
а он подойдет ко второй шейдерной модели?

Re: Blur при прицеливании

СообщениеДобавлено: 22 окт 2014, 19:58
Zaic
return mix(color, sum, t);

почему ругается на эту функцию
пишет ambigupus overloaded function reference " mix(color, sum, t)