6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

カメラ画像を上下左右反転・引き延ばして表示する

Last updated at Posted at 2016-05-28

最近はVR/AR界隈が特に盛り上がっていますが(自分の中で)、
VR/ARで使えそうな、出力画像を加工するシェーダーを作りました。
画像の上下左右反転、引き延ばし、曲面補正が可能です。
レースゲームのバックミラーなんかにも使えるんじゃないかと思います。

スクリーンショット 2016-05-29 0.23.42.png

CorrectARCameraShader.shader
Shader "Unlit/CorrectARCameraShader"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "black" {}
		[Toggle] _FlipX("X Flip", Float) = 0
		[Toggle] _FlipY("Y Flip", Float) = 0
		_Brightness ("Brightness", Range (0, 2)) = 1
		_Strech ("Strech", Vector)=(1,1,0,0)
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 100

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				UNITY_FOG_COORDS(1)
				float4 vertex : SV_POSITION;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float _FlipX;
			float _FlipY;
			float _Brightness;
			float4 _Strech;
			
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				if(_FlipX>0) o.uv.x = 1-o.uv.x;
				if(_FlipY>0) o.uv.y = 1-o.uv.y;
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				float2 duv = i.uv + float2(sin(i.uv.x*3.1416*2)*_Strech.z,sin(i.uv.y*3.1416*2)*_Strech.w);
				float2 stuv = 0.5+(duv-0.5)/_Strech.xy;
				// sample the texture
				fixed4 col = tex2D(_MainTex, stuv.xy);
				col.rgb *= _Brightness;
				return col;
			}
			ENDCG
		}
	}
}

Stretch はx/yが拡大率、z/wが曲面補正になっています。

実際に使用する際には、上記シェーダーを適用したマテリアルを作成し、
カメラに下記スクリプトをアタッチします

CorrectARCamera.cs
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
[RequireComponent (typeof(Camera))]
public class CorrectARCamera : MonoBehaviour {
	public Material mat;

	void OnRenderImage(RenderTexture src, RenderTexture dest) {
		Graphics.Blit(src, dest, mat);
	}
}

スクリーンショット 2016-05-28 23.49.43.png

スクリーンショット 2016-05-28 23.45.04.png

それでは良いARライフを!

[関連]
Fisheye shader

6
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?