ぼかし・モーションブラー
ぼかしを行うにはどうすればよいのかというと、
ある点のピクセルを基点として、
- 上にある色
- 左にある色
- 右にある色
- 下にある色
- 自身の色
をすべて足して、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をそのまま出力
テクスチャ
- LPDIRECT3DTEXTURE9でテクスチャの宣言
- D3DXCreateTextureFromFile(LPDIRECT3DDEVICE9*, fileName, LPDIRECT3DTEXTURE9*)でテクスチャの読み込み
- IDIRECT3DDEVICE9::SetTexture(stage, LPDIRECT3DTEXTURE9*)…stageはステージ識別子
ラッピングモードの設定
IDIRECT3DDEVICE9::SetSamplerState(stage, type, value)