ぼかし・モーションブラー

ブラー

ぼかしを行うにはどうすればよいのかというと、
ある点のピクセルを基点として、

  1. 上にある色
  2. 左にある色
  3. 右にある色
  4. 下にある色
  5. 自身の色

をすべて足して、5で割るとぼやけた感じの色になります。
 
 
モーションブラーとは、ぼかしを特定の方向に行うことにより、
動きのある画像を作り出すことです。
 
図では、右下方向へのぼかしを行うことにより、
左上方向へのモーションブラーを実現しています。
 
図では、4つの平均値を取っていますが、
この数を変化させることにより、ブラーの強さを変えることができます。
 
また、抽出方向を変化させることにより、ブラーの方向を変えることができます。

Pygameで画像処理

ぼかしです。

import pygame
import math

# ぼかし
# @param tBuf サーフェス
# @return 変換後のサーフェス
def transBlur(tBuf):
	retBuf = pygame.transform.scale(tBuf, tBuf.get_size())
	
	for j in range(1, retBuf.get_height()-1):
		for i in range(1, retBuf.get_width()-1):
			color1 = tBuf.get_at((i,   j-1))
			color2 = tBuf.get_at((i-1, j))
			color3 = tBuf.get_at((i,   j+1))
			color4 = tBuf.get_at((i+1, j))
			color5 = tBuf.get_at((i,   j))
			color = (
				(color1[0]+color2[0]+color3[0]+color4[0]+color5[0])/5,
				(color1[1]+color2[1]+color3[1]+color4[1]+color5[1])/5,
				(color1[2]+color2[2]+color3[2]+color4[2]+color5[2])/5,
				255)
			retBuf.set_at((i, j), color)
	return retBuf
# Main
def main():
	pygame.init()
	pygame.display.set_mode((250, 250), 0, 32)
	pygame.display.set_caption("ぼかし")
	_gScr = pygame.display.get_surface()
	tBuf = pygame.image.load("nyan.bmp").convert()

	i = 32
	while True:
		tBuf = transBlur(tBuf)
		_gScr.blit(tBuf, (0, 0), tBuf.get_rect())
		pygame.display.update()
		for e in pygame.event.get():
			if e.type == pygame.QUIT: return
		pygame.time.wait(10)

if __name__ == '__main__':
	main()

Pygameで画像処理

左上方向のモーションブラーです。

import pygame
import math

# モーションブラー(左上)
# @param tBuf サーフェス
# @return 変換後のサーフェス
def transBlur(tBuf):
	retBuf = pygame.transform.scale(tBuf, tBuf.get_size())
	
	for j in range(retBuf.get_height()-5):
		for i in range(retBuf.get_width()-5):
			color1 = tBuf.get_at((i,   j))
			color2 = tBuf.get_at((i+1, j+1))
			color3 = tBuf.get_at((i+2, j+2))
			color4 = tBuf.get_at((i+3, j+3))
			color5 = tBuf.get_at((i+4, j+4))
			color = (
				(color1[0]+color2[0]+color3[0]+color4[0]+color5[0])/5,
				(color1[1]+color2[1]+color3[1]+color4[1]+color5[1])/5,
				(color1[2]+color2[2]+color3[2]+color4[2]+color5[2])/5,
				255)
			retBuf.set_at((i, j), color)
	return retBuf
# Main
def main():
	pygame.init()
	pygame.display.set_mode((250, 250), 0, 32)
	pygame.display.set_caption("ぼかし")
	_gScr = pygame.display.get_surface()
	tBuf = pygame.image.load("nyan.bmp").convert()

	i = 32
	while True:
		tBuf = transBlur(tBuf)
		_gScr.blit(tBuf, (0, 0), tBuf.get_rect())
		pygame.display.update()
		for e in pygame.event.get():
			if e.type == pygame.QUIT: return
		pygame.time.wait(10)

if __name__ == '__main__':
	main()

DirectX再入門3

頂点シェーダとピクセルシェーダ

頂点シェーダは頂点単位で処理を行うが、
ピクセルシェーダは一つ一つのピクセル単位で処理を行う。
そして、ピクセルシェーダが行う処理の中で特に重要なのが、テクスチャマッピングである。

テクスチャマッピング

模様(テクスチャ)画像から必要な部分を抜き出し、
ポリゴンに貼り付ける(マッピング)する処理のこと。

テクスチャ座標

テクスチャの抜き出す部分の座標のこと。

テクスチャステージ

テクスチャとポリゴンの合成値・方法を決めるところ。
合成値として以下の値を設定する。(arg1

  • ディフューズ成分
  • スペキュラー成分
  • テクセルの色成分
  • 定数値

合成方法として以下の方法から選択する。

  • どちらかをそのまま出力する
  • 両方を掛け合わせる
  • 両方を足し合わせる

IDIRECT3DDEVICE9::SetTextureStageState(stage, type, value)
@param stage ステージ識別子
@param type D3DTEXTURESTAGESTATETYPE列挙型
@param value ステート値

D3DTEXTURESTAGESTATETYPE列挙型
  • D3DTSS_COLOROP:valueがD3DTOP_SELECTARG1の場合、arg1をそのまま出力
テクスチャ
  1. LPDIRECT3DTEXTURE9でテクスチャの宣言
  2. D3DXCreateTextureFromFile(LPDIRECT3DDEVICE9*, fileName, LPDIRECT3DTEXTURE9*)でテクスチャの読み込み
  3. IDIRECT3DDEVICE9::SetTexture(stage, LPDIRECT3DTEXTURE9*)…stageはステージ識別子
ラッピングモードの設定

IDIRECT3DDEVICE9::SetSamplerState(stage, type, value)