Поправить MotionBlur

Эффекты постобработки

Поправить MotionBlur

Сообщение RefractoR 15 июн 2010, 13:34

Нашел на оф форуме неплохой шейдер размытия движения, но как сказал сам создатель шейдера: там проблемы с вычислениями матриц. Я переписал скрипт управления данным шейдером на сишарп, переписал вычисления матриц, но все же шейдер работает не так, как хочется - размытие происходит только при движении объекта вверх / вниз и при поворотах (при поворотах особенно сильное размытие).

Переписанный скрипт управления:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

[AddComponentMenu("Image Effects/CameraMotionBlur")]
[RequireComponent (typeof (Camera))]

public class MotionBlurComponent : MonoBehaviour {
       
        public Shader blurShader;
        public float strength = 12.0f;
        public Transform target;
       
        Material m_CompositeMaterial;
       
        Material GetCompositeMaterial() {
               
                if (!m_CompositeMaterial) {
                        m_CompositeMaterial = new Material(blurShader);
                        m_CompositeMaterial.hideFlags = HideFlags.HideAndDontSave;
                }
                return m_CompositeMaterial;
               
        }
       
        void OnDisable () {
               
                DestroyImmediate(m_CompositeMaterial);
               
        }
       
        void OnPreCull () {
               
                Matrix4x4 Iview = target.localToWorldMatrix * transform.worldToLocalMatrix * camera.projectionMatrix;
                Shader.SetGlobalMatrix("_Myview", Iview.inverse);
               
        }
       
        void OnRenderImage (RenderTexture source, RenderTexture destination) {
               
                Material compositeMat = GetCompositeMaterial();
                compositeMat.SetFloat("_Strength", strength);
                ImageEffects.BlitWithMaterial(compositeMat, source, destination);
               
        }
       
        void OnPostRender () {
               
                StartCoroutine("RenderLate");
               
        }
       
        IEnumerator RenderLate () {
               
                yield return new WaitForEndOfFrame();
                Matrix4x4 Iviewprev = target.localToWorldMatrix * transform.worldToLocalMatrix * camera.projectionMatrix;
                Shader.SetGlobalMatrix("_Myviewprev", Iviewprev);
               
        }

}
 


Оригинальный скрипт управления:
Синтаксис:
Используется javascript
#pragma strict

@script ExecuteInEditMode
@script AddComponentMenu("Image Effects/CameraMBlur")
@script RequireComponent(Camera)

var compositeShader : Shader;
var Strength = 13.0;
private var m_CompositeMaterial : Material;
 
private function GetCompositeMaterial() : Material {
        if (m_CompositeMaterial == null) {
                m_CompositeMaterial = new Material( compositeShader );
                m_CompositeMaterial.hideFlags = HideFlags.HideAndDontSave;
        }
        return m_CompositeMaterial;
}
function OnDisable() { 
        DestroyImmediate (m_CompositeMaterial);
}
function OnPreCull()
{
        var Iview=(camera.worldToCameraMatrix.inverse * camera.projectionMatrix);
        Shader.SetGlobalMatrix("_Myview", Iview.inverse);
}

// Called by the camera to apply the image effect
function OnRenderImage (source : RenderTexture, destination : RenderTexture) : void
{
        var compositeMat = GetCompositeMaterial();
        compositeMat.SetFloat("_Strength", Strength);

        ImageEffects.BlitWithMaterial(compositeMat, source, destination);

}

function OnPostRender()
{
renderlate();
}


function renderlate ()
{

yield WaitForEndOfFrame();
var Iviewprev=(camera.worldToCameraMatrix.inverse * camera.projectionMatrix);
Shader.SetGlobalMatrix("_Myviewprev", Iviewprev);
}
 


Сам шейдер:
Синтаксис:
Используется glsl
Shader "CameraMBlur" {
Properties {
        _MainTex ("", RECT) = "white" {}
        _Strength ("Strength", Range (1, 30)) = 15.0
}

SubShader {
        Pass {
                ZTest Always Cull off ZWrite Off Fog { Mode off }

CGPROGRAM
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"

uniform samplerRECT _MainTex;

struct v2f {
        float4 pos      : POSITION;
        float2 uv       : TEXCOORD0;

};

v2f vert (appdata_base v)
{

        v2f o;
        o.pos = mul (glstate.matrix.mvp, v.vertex);
        o.uv.xy=v.texcoord;
        return o;
}

uniform float4x4 _Myview;
uniform float4x4 _Myviewprev;
uniform float _Strength;

half4 frag (v2f i) : COLOR
{
float2 Texcoord =i.uv;
  // Get the depth buffer value at this pixel.  
  float zOverW = 1;  
// H is the viewport position at this pixel in the range -1 to 1.  
float4 H = float4(Texcoord.x * 2 - 1, (1 - Texcoord.y) * 2 - 1,zOverW, 1);  
// Transform by the view-projection inverse.  
   float4 D = mul(H, _Myview);  
// Divide by w to get the world position.  
   float4 worldPos = D / D.w;  
     // Current viewport position  
   float4 currentPos = H;  
// Use the world position, and transform by the previous view-  
   // projection matrix.  
   float4 previousPos = mul(worldPos, _Myviewprev);  
// Convert to nonhomogeneous points [-1,1] by dividing by w.  
previousPos /= previousPos.w;  
// Use this frame's position and last frame's to compute the pixel  
   // velocity.  
   float2 velocity = (currentPos - previousPos)/_Strength;  
   
    // Get the initial color at this pixel.  
   float4 color = texRECT(_MainTex, Texcoord);  
Texcoord += velocity;  
for(int i = 1; i < 12; ++i, Texcoord += velocity)  
{  
  // Sample the color buffer along the velocity vector.  
   float4 currentColor = texRECT(_MainTex, Texcoord);  
  // Add the current color to our color sum.  
  color += currentColor;  

}  
// Average all of the samples to get the final blur color.  
   float4 finalColor = color / 12;  
       
        return finalColor;
}
ENDCG
        }
}

Fallback off

}
 


Еще раз напомню, что внимание, судя по всему, надо обратить на вычисления матриц.
Статья, по которой был написан шейдер
RefractoR
UNIт
 
Сообщения: 50
Зарегистрирован: 05 ноя 2009, 16:31
Откуда: Краснодар
  • ICQ

Re: Поправить MotionBlur

Сообщение Neodrop 15 июн 2010, 13:40

А чем он лучше родного мошнблюра? :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Поправить MotionBlur

Сообщение RefractoR 15 июн 2010, 13:43

Родной примитивен. Данный шейдер дает более натуральный результат
RefractoR
UNIт
 
Сообщения: 50
Зарегистрирован: 05 ноя 2009, 16:31
Откуда: Краснодар
  • ICQ

Re: Поправить MotionBlur

Сообщение Neodrop 15 июн 2010, 13:46

Что то я сильно сомневаюсь..
Нет ли картинок для сравнения "примитивного" и "продвинутого" вариантов? :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Поправить MotionBlur

Сообщение RefractoR 15 июн 2010, 13:49

Я говорю примерно о таком размытии
RefractoR
UNIт
 
Сообщения: 50
Зарегистрирован: 05 ноя 2009, 16:31
Откуда: Краснодар
  • ICQ

Re: Поправить MotionBlur

Сообщение Kann 15 июн 2010, 15:21

по моему это PixelMotionBlur сомнительная выгода.....
http://http.developer.nvidia.com/GPUGem ... _ch27.html
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Поправить MotionBlur

Сообщение RefractoR 15 июн 2010, 15:35

Возможно, но я не умею писать шейдеры, а других готовых не находил (конечно, можно использовать RadialBlur, который прилично выглядит, но он только в одном направлении работает)...
RefractoR
UNIт
 
Сообщения: 50
Зарегистрирован: 05 ноя 2009, 16:31
Откуда: Краснодар
  • ICQ

Re: Поправить MotionBlur

Сообщение Neodrop 15 июн 2010, 22:38

На мой взгляд это вообще излишества. И тратить на них время и силы уместно только тогда, когда вся программа уже написана. Да и то, блюр почти всегда излишество.
Но, дело ваше, конечно.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Поправить MotionBlur

Сообщение LightWorld 18 янв 2013, 05:34

Проблема решается увлечением значение Strength до 200.
Аватара пользователя
LightWorld
UNIт
 
Сообщения: 96
Зарегистрирован: 14 сен 2011, 09:21
Откуда: г. Зарафшан


Вернуться в Post-effects

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

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