motion blur для гонок на Unity

Предложения о постоянной работе и разовых заказах.

motion blur для гонок на Unity

Сообщение Novotek 19 фев 2011, 14:31

Всем привет!
Друзья, требуется ваша помощь в решении одной задачи.
Далее привожу описание

Описание:
Необходимо реализовать motion blur для online-игры на Unity.
Графический пример:
http://i082.radikal.ru/1102/44/e91d4954ebe1.jpg (в середине блура нет, по краям есть, и тот который есть – радиальный). Стандартный Motion Blur в Unity не подходит.

Реализация:
реализовать на демке (http://unity3d.com/support/resources/fi ... torial.zip) в виде ограниченного набора скриптов или скрипта+шэйдера

Технические требования:
Скрипт или скрипт+шэйдер, (скрипт обязательно на C#) который создает заданный эффект.
Степень размытия должна регулироваться в рантайме, в зависимости от скорости машинки.

Оплата:
сдельная, по результатам работы. В перспективе возможно развитие сотрудничества.
Novotek
UNец
 
Сообщения: 6
Зарегистрирован: 20 янв 2011, 18:49

Re: motion blur для гонок на Unity

Сообщение Ert Donuell 19 фев 2011, 15:30

Учитесь пользоваться поиском.
Вот то что Вы просили.

Степень размытости меняйте через публичные переменные blurStrength и blurWidth.

Деньги в кассу :D
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ

Re: motion blur для гонок на Unity

Сообщение Novotek 19 фев 2011, 17:00

Боюсь, что деньги в кассе как раз и останутся) Есть мнение, что после кой-каких в 3,1 есть некоторые изменения в шейдерах и в результате как по ссылке получается не совсем то, что надо. Если ошибаюсь - поправьте, плз. Буду только рад)
Novotek
UNец
 
Сообщения: 6
Зарегистрирован: 20 янв 2011, 18:49

Re: motion blur для гонок на Unity

Сообщение Ert Donuell 19 фев 2011, 17:16

RadialBlur.cs:
Синтаксис:
Используется csharp
using UnityEngine;

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

    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 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);
    }
}

RadialBlur.shader:
Синтаксис:
Используется glsl
// Upgrade NOTE: replaced 'samplerRECT' with 'sampler2D'
// Upgrade NOTE: replaced 'texRECT' with 'tex2D'

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
// Upgrade NOTE: excluded shader from Xbox360 and OpenGL ES 2.0 because it uses unsized arrays
#pragma exclude_renderers xbox360 gles
       
        #pragma vertex vert_img
        #pragma fragment frag
        #pragma fragmentoption ARB_precision_hint_fastest

        #include "UnityCG.cginc"

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

        half4 frag (v2f_img i) : COLOR {
                half4 color = tex2D(_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 += tex2D(_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 lerp(color, sum, t);
        }
        ENDCG
                }
        }
}
 


Результат на Unity 3.2:
Изображение

Так что деньги в кассу :ymhug:
Добавить dmitrii.baranov.yumasoft в Skype
Аватара пользователя
Ert Donuell
Старожил
 
Сообщения: 781
Зарегистрирован: 05 июл 2010, 09:50
Откуда: Санкт-Петербург
  • ICQ


Вернуться в Предложение Работы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6