DXライブラリにおけるピクセルシェーダの使い方について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Priest
記事: 123
登録日時: 13年前
住所: 愛知

DXライブラリにおけるピクセルシェーダの使い方について

#1

投稿記事 by Priest » 13年前

今描写してる画面をグレースケール化して表示したいなと思い立ったことをきっかけに、
使えそうな手法を検索し、ぴくせるしぇーだに初めて手をつけました。

紆余曲折があってなんとかグレースケール化はできたのですが、それから透過処理ができたらいいなと思うようになりました。

やりたいことを具体的に述べると、フルカラーの描写画面の上にそれをグレースケール化した画像を配置し、その画像を少しずつα値をあげて薄くしていくことで、
モノクロ画像からカラー画像へ変わっていくように見せることです。

下記に、その画像の表示部分をつかさどる関数の一部と、ぴくせるしぇーだの設定ファイル?について示しておきます。

現在透過処理ができていません。何が違うのかもちょっと不明です。
申し訳ありませんが、道を示して頂けませんか?

コード:

/* 画像表示用関数の一部 */
    // 使用するテクスチャをセット
    SetUseTextureToShader(0, Screen);	
    // 使用するピクセルシェーダをセット
    SetUsePixelShader(Shader.Gray);

    /*-- 正直ここからよくわかっていません。分かるのはpsoファイルの方に何かを送ろうとしていることだけ。行き当たりばったりな実装です --*/
    int cindex = GetConstIndexToShader("Alpha", Shader.Gray); 
    INT4 alpha= {Game.Frame-745, Game.Frame-745, Game.Frame-745, Game.Frame-745}; // 理想的なα値はgame.Frame-745(game.Frame-745>0の時)です。
    SetPSConstI(cindex, alpha);
   /*-- ここまで --*/

    // 描画 
    //SetDrawBlendMode(DX_BLENDMODE_ALPHA,Game.Frame-745); // これでブレンドできたら嬉しいのになぁ
    DrawPrimitive2DToShader( Vert, 6, DX_PRIMTYPE_TRIANGLELIST );
    //SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0);

/* fxファイル */
struct PS_INPUT {
    float4 Diffuse         : COLOR0 ;
    float4 Specular        : COLOR1 ;
    float2 TexCoords0      : TEXCOORD0 ;
    float2 TexCoords1      : TEXCOORD1 ;
} ;

struct PS_OUTPUT{
    float4 Output          : COLOR0 ;
} ;

sampler sampler0 : register( s0 ) ;
int4 Alpha;

PS_OUTPUT main( PS_INPUT psin ){
    PS_OUTPUT psout ;
    float4 texc ;
    float ave;

    texc  = tex2D( sampler0, psin.TexCoords0 ) ; 
    ave=(texc.b+texc.g+texc.r)/3;
    psout.Output.r = ave ;
    psout.Output.g = ave ;
    psout.Output.b = ave ;
    if(Alpha.a>0) psout.Output.a = Alpha.a ;
    else psout.Output.a = texc.a ;

    return psout ;
}

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: DXライブラリにおけるピクセルシェーダの使い方について

#2

投稿記事 by h2so5 » 13年前

HLSLはあまり触ったことがないので推測で申し訳ないのですが、こんな感じではないでしょうか。
Alphaに設定する値は0.0~1.0の範囲のfloatにしてください。

コード:

/* fxファイル */
struct PS_INPUT {
    float4 Diffuse         : COLOR0 ;
    float4 Specular        : COLOR1 ;
    float2 TexCoords0      : TEXCOORD0 ;
    float2 TexCoords1      : TEXCOORD1 ;
} ;
 
struct PS_OUTPUT{
    float4 Output          : COLOR0 ;
} ;
 
sampler sampler0 : register( s0 ) ;
float Alpha;
 
PS_OUTPUT main( PS_INPUT psin ){
    PS_OUTPUT psout ;
    float4 texc ;
    float ave;
 
    texc = tex2D( sampler0, psin.TexCoords0 ) ; 
    ave = ( texc.b + texc.g + texc.r ) / 3;
    psout.Output.r = texc.r * Alpha + ave * ( 1.0 - Alpha) ;
    psout.Output.g = texc.g * Alpha + ave * ( 1.0 - Alpha) ;
    psout.Output.b = texc.b * Alpha + ave * ( 1.0 - Alpha) ;
 
    return psout ;
}

Priest
記事: 123
登録日時: 13年前
住所: 愛知

Re: DXライブラリにおけるピクセルシェーダの使い方について

#3

投稿記事 by Priest » 13年前

無事動きました。ありがとうございました!

原因は完全にこれを失念していたことです。
h2so5 さんが書きました:Alphaに設定する値は0.0~1.0の範囲のfloatにしてください。
ちなみに、psoutはこうすることでうまくいきました。

コード:

ave = ( texc.b + texc.g + texc.r ) / 3;
psout.Output.r = ave ;
psout.Output.g = ave ;
psout.Output.b = ave ;
psout.Output.a = Alpha.a ;

コード:

#include <Priest.h>
int MyPolicy ( void ) { printf( "何事も楽しくね!" ); return 0; }

閉鎖

“C言語何でも質問掲示板” へ戻る