強火で進め

このブログではプログラム関連の記事を中心に書いてます。

Unityで外枠付きのプログレスバー(ProgressBar)を実装

プログレスバーと言えば外側に枠が付いているバージョンもよく有るのでそのパターンを1つのシェーダで描画する実装を作ってみました。

この様に外枠用と内側のバーの部分の2つのテクスチャを準備して利用可能です。バーの色は Color の設定で変更出来ます。

プロジェクトファイルはこちらからダウンロード出来ます。

Shader

// Upgrade NOTE: replaced 'glstate.matrix.mvp' with 'UNITY_MATRIX_MVP'

Shader "Custom/ProgressBar2" {

Properties {
	_Color ("Color", Color) = (1,1,1,1)
	_InsideTex ("Inside (RGBA)", 2D) = "white" {}
	_OutsideTex ("Outside (RGBA)", 2D) = "black" {}	
	_Progress ("Progress", Range(0.0,1.0)) = 0.0
}
 
SubShader {
	Tags { "Queue"="Transparent" "LightMode" = "Always" }
	LOD 200
	Blend SrcAlpha OneMinusSrcAlpha

CGPROGRAM
#pragma surface surf Lambert
 
uniform sampler2D _InsideTex;
uniform sampler2D _OutsideTex;
uniform float4 _Color;
uniform float _Progress;
 
struct Input {
	float2 uv_InsideTex;
	float2 uv_OutsideTex;
};

void surf (Input IN, inout SurfaceOutput o) {
	fixed4 c = tex2D(_InsideTex, IN.uv_InsideTex);
	fixed4 outside = tex2D(_OutsideTex, IN.uv_OutsideTex);
	c *= _Color;
	c.a *= IN.uv_InsideTex.x < _Progress;	
	c = (1.0 - outside.a)*c + outside*outside.a;

	o.Albedo = c.rgb;
	o.Alpha = c.a;
}

ENDCG
}
 
}

以下のpragmaを追加するとDraw Callが4→1と減るのですがGLESでも動作させてたいので入れていません。GLESで動作させる予定が無い場合は入れておくと動作が速くなると思います。
(2012/03/27 追記)
今、確認したらDraw Call減らなかったです。勘違いだった?
(追記)

#pragma exclude_renderers gles

関連情報

Unityでプログレスバー(ProgressBar)を実装 - 強火で進め
http://d.hatena.ne.jp/nakamura001/20130309/1362836691

自分のShaderはDraw Callが4だけどこちらのものはDraw Callが1です。もっと最適化せねば… と思いどこで差が出ているのか調査した所、「 #pragma exclude_renderers gles 」が有るか無いか。うーん、そこか!! 自分のシェーダもこれを付けるとDraw Callが1に成りました。

ProgressBar.shader - games-development-project - The FPS in futuristic atmosphere demonstrating what can be done with Unity in 1 month - Google Project Hosting
http://code.google.com/p/games-development-project/source/browse/trunk/Assets/Shaders/ProgressBar.shader?r=3