フィードバックブラーをどうやって軽くするんだろうか・・・

EKISUKE
記事: 108
登録日時: 13年前

フィードバックブラーをどうやって軽くするんだろうか・・・

投稿記事 by EKISUKE » 13年前

先生にブラーの処理をしたいのだけれど、どういうアルゴリズムなのか聞いたところ、
元の画像を拡大してアルファ値を少なくしたものを元画像の上から描画すればできる。ということなので、以下のようなプログラムをくんでみた。

openframeworksを使用しています。

CODE:

#include "testApp.h"

//--------------------------------------------------------------
void testApp::setup(){
	test.loadImage("Nero.png");
}

//--------------------------------------------------------------
void testApp::update(){
	
	
	for( int i=0; i
#include 

//--------------------------------------------------------------
void testApp::setup(){
	test.loadImage("Nero.png");
}

//--------------------------------------------------------------
void testApp::update(){
	
	
	/*for( int i=0; i<MAX_RADIAL; i++){
		copy[i].clone(test);
		copy[i].resize(test.width * (1.05f + i * 0.05f), test.height * (1.05f + i * 0.05f));
	}*/
	
}

//--------------------------------------------------------------
void testApp::draw(){
	test.draw(0,0);
	int x,y;
	x = 0;
	y = 0;
	for( int i=0; i<MAX_RADIAL; i++){
		copy[i].clone(test);
		copy[i].resize(test.width * (1.05f + i * 0.05f), test.height * (1.05f + i * 0.05f));
		//test.resize(test.width * (1.05f + i * 0.05f), test.height * (1.05f + i * 0.05f));
		//glTexSubImage2D(GL_TEXTURE_2D, 0, x, y,test.width, test.height, GL_RGB, GL_UNSIGNED_BYTE, &test);

		ofSetColor(255,255,255,90 - i * i);
		ofEnableAlphaBlending();
		float posx, posy, first_w, first_h;
		first_w = (test.width * 0.025);
		first_h = (test.height * 0.025);
		//// 元画像の幅、高さの拡大率の半分だけ描画位置をずらす
		posx = 0 - ( first_w ) - (first_w * i);
		posy = 0 - ( first_h ) - (first_h * i);
		copy[i].draw(posx,posy);
		//test.draw(0,0);
		ofDisableAlphaBlending();
	}
}
メモリ上での画像のコピーの方法はどうするのだろうか。
フィードバックブラーについていろいろ調べてみるとDXでやっているのが多いみたいだから、一回DXの勉強をして使ってみようかな。
結局実装はopenframeworksでしたいのだけれども・・・・制作展のものだし、早くできるようにしたいな。
最後に編集したユーザー EKISUKE on 2012年12月16日(日) 15:46 [ 編集 1 回目 ]

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前

Re: フィードバックブラーをどうやって軽くするんだろうか・・・

投稿記事 by h2so5 » 13年前

そのアルゴリズムだと画像の中心にはブラーがかからないですね。そういうタイプのブラーもあると思いますが。
僕が以前実装したブラーでは、周囲のピクセルの平均値を取る方法を使っていました。
画像処理ソフトではガウス関数を使ったものもよく使われますね(ガウシアンフィルタ)

EKISUKE
記事: 108
登録日時: 13年前

Re: フィードバックブラーをどうやって軽くするんだろうか・・・

投稿記事 by EKISUKE » 13年前

画像
h2so5 さんが書きました:そのアルゴリズムだと画像の中心にはブラーがかからないですね。
ブラーをまだ理解できていないのですが、上記の画像は中心にブラーがかかってない状態ですか?
h2so5 さんが書きました: そういうタイプのブラーもあると思いますが。
僕が以前実装したブラーでは、周囲のピクセルの平均値を取る方法を使っていました。
画像処理ソフトではガウス関数を使ったものもよく使われますね(ガウシアンフィルタ)
なるほど。ラジアルブラーについて調べてる時に出てきました。
周囲のピクセルの平均値をとる方法は、すぐに思いつかなかったので、
この方法の方が簡単で早いならそうしようと思い、やってみたものの、処理がすごく重たいので、どうしようかと思っています。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前

Re: フィードバックブラーをどうやって軽くするんだろうか・・・

投稿記事 by h2so5 » 13年前

ブラーをまだ理解できていないのですが、上記の画像は中心にブラーがかかってない状態ですか?
中心に行くほどブラーの効果が弱くなっていますね。
ズームアップしているような残像の表現をしたい場合はこのタイプのブラーが有効でしょう。

平均値やガウス関数を使う方法は、すべてが均一にぼやけますが負荷が高いです。
リアルタイムで演算する場合はプログラマブルシェーダを使ったほうがよいでしょう。
最後に編集したユーザー h2so5 on 2012年12月16日(日) 19:34 [ 編集 1 回目 ]

EKISUKE
記事: 108
登録日時: 13年前

Re: フィードバックブラーをどうやって軽くするんだろうか・・・

投稿記事 by EKISUKE » 13年前

横スクロールのゲームに実装したいのですが、その進行方向に対して、残像と言いますか、ブラーをかけたいと思っています。
なので、横方向に拡大した画像をアルファ値を少なくして、上から描画という方法でできるかな。と思ってやってるのですが、画像のコピーが重たいようですね。
プログラマブルシェーダは負荷が低くて、上記のような表現が可能なのですか?
ちなみにここのサイトを読んで勉強しようと思います。
http://marupeke296.com/ProShader_main.html