2022年2月16日水曜日
Fスクリーンキーボード ver3.01
■ダウンロード
fkey301.zip
size: 678KB
分類: フリーソフト
MD5: 0c084678591602b369dc87fbfaa9676a
■概要
スクリーンキーボードにフリック機能をつけて、ctrlやshiftへのカーソル移動の手間を少し減らすことができます。
従来の日本語キーボードの他に、日本語フリック入力用のレイアウトや、テンキーや50音キーボードなども使用できます。
■動作環境
Windows 10
CPU 2GHz以上
メモリ 4GB以上
■アンインストール
レジストリは触っておりません。
削除の際はフォルダごとゴミ箱へ。
■使い方
・表示されているキーを左クリックすることでキー入力できます。
・フリック(クリックしたままカーソルを移動し、指を離す)することで
ShiftやCtrlキーを付加したり、関連したキーを押すことができます。
・右クリックフリックで最小化やコンフィグ表示、レイアウト変更などを行うことができます。
右クリックフリックは設定で自由に変更できます
詳しくはhelp.htmlを参照してください。
■そのほか
このソフトウェアを使用し、何らかの障害が発生しても責任を取りかねますのでご了承ください。
■更新履歴
2022-02-16 ver 3.01
デフォルトサイズの1.25倍~4倍のサイズに変更するシステムフリック項目を追加
2022-01-08 ver 3.00b
最小化した状態で終了すると、次に起動時にウィンドウがどっか行く問題を修正。
最小化状態でシステムメニューを出したとき、別ウィンドウアクティブ化する機能が働いてシステムメニューが閉じられてしまう問題を修正。
2021-06-02 ver 3.00a
テンキーexの追加。
スキャンコード使用時のコードが間違ってるのを修正-
2021-02-07 ver 3.00
2022年1月9日日曜日
Fスクリーンキーボード ver3.00b
■ダウンロード
fkey300b.zip
size: 677KB
分類: フリーソフト
MD5: b7c2438d043fc6be41a5a2f1ac605023
■概要
スクリーンキーボードにフリック機能をつけて、ctrlやshiftへのカーソル移動の手間を少し減らすことができます。
従来の日本語キーボードの他に、日本語フリック入力用のレイアウトや、テンキーや50音キーボードなども使用できます。
■動作環境
Windows 10
CPU 2GHz以上
メモリ 4GB以上
■アンインストール
レジストリは触っておりません。
削除の際はフォルダごとゴミ箱へ。
■使い方
・表示されているキーを左クリックすることでキー入力できます。
・フリック(クリックしたままカーソルを移動し、指を離す)することで
ShiftやCtrlキーを付加したり、関連したキーを押すことができます。
・右クリックフリックで最小化やコンフィグ表示、レイアウト変更などを行うことができます。
右クリックフリックは設定で自由に変更できます
詳しくはhelp.htmlを参照してください。
■そのほか
このソフトウェアを使用し、何らかの障害が発生しても責任を取りかねますのでご了承ください。
■更新履歴
2022-01-08 ver 2.00b
最小化した状態で終了すると、次に起動時にウィンドウがどっか行く問題を修正。
最小化状態でシステムメニューを出したとき、別ウィンドウアクティブ化する機能が働いてシステムメニューが閉じられてしまう問題を修正。
2021-06-02 ver 3.00a
テンキーexの追加。
スキャンコード使用時のコードが間違ってるのを修正-
2021-02-07 ver 3.00
2021年12月21日火曜日
にっきちゃん2021
今年一年やってたこと。
https://youtu.be/98rSC9a0LvY
http://www.rastertek.com/tutdx11.html
基本的にこのサイトさんを中心にDirectX11を触ってた。
■メモリ
ゲームオブジェクト用のメモリ領域を保持管理するために、メモリプールクラスを作った。
メモリ断片化を防ぐ狙いだけど、今のところそこまで長時間使用したことがないので効果のほどはわからない。
patriotDark、ring^-27、LUXでもメモリ管理はしていたけど、今回ちょっと仕組みをいじくって新調した。
メモリを返却時に前後のメモリ使用状況をみて結合する。
■パックファイル
複数ファイルを一ファイルにまとめる仕組み。
ZIPファイル構造をまねして、ファイル一覧情報を終端に置いた。
各ファイル内容をメモリに保持することなく記述できるし、読み込み時のファイル一覧取得もパックファイル終端だけを読めば取得できるので負担が小さめ。
ファイル書き込み時に圧縮して保存するオプションをついでにつけてみたけど、今のところ使ってない。
■mesh
http://www.rastertek.com/dx11tut08.html
をそのまま使って読み込みを行い、バイナリにして出力するツールを作成、メインプログラムでバイナリを読み込んで表示までもっていっている。
.objはBlenderでも出力できるので制作環境を変えずに済んでいる。
■ブラーシェーダ
よくある2パスつかって、コンピュートシェーダで縦横ぼかすやつ。
https://sites.google.com/site/monshonosuana/directxno-hanashi-1/directx-109
もんしょさんところにあった各ピクセルをgroupsharedメモリに一旦ためるプログラムを拝借した。
参照するテクスチャと書き込むテクスチャの大きさが違っても動くようにしている。
ピクセル位置計算がすごい雑だが、まあぼかすからいいよねって感じに雑にしている。
ブラーシェーダはDOFとブルームに使用。
DOF用のブラーはメイン画面の半分のサイズで速度とボケ具合を稼いでいる。
■ブライトシェーダ
一定の明るさ以上の部分を抜き出す。明るさ計算にグレースケールにして計算して、一定以下ならアルファを0にしている。
ブルームさせたい部位があるオブジェクトのために、マルチレンダーダーゲット可能なようメイン画面と同じサイズのテクスチャにしている。
■ブルームシェーダ
ブライトシェーダで抜き出した明るい部分をテクスチャ縮小しながら3枚作成して、それぞれスクリーン合成した。
最初は4枚合成してたけど、あまりにも重いので3枚に減らした。
1枚目がメイン画面の1/4、2枚目が1/8、3枚目が1/16のサイズ。
■ポストエフェクト用の頂点シェーダ
https://hikita12312.hatenablog.com/entry/2018/01/25/230502
を参考に、画面全体を書き換える用の頂点シェーダを作成、使用している。
ポリゴンの表裏が違うのかうまく描画できなかったのでちょっといじっている。
大した計算コストでもないだろうから下だけでいいかもしれない。
■CPUパーティクル
世間ではGPUパーティクルが主流だけど。
頂点を生成して頂点シェーダ→ジオメトリシェーダ→ピクセルシェーダで描画する方法を使っている。
下は、一頂点から2ポリゴン生成するジオメトリシェーダ。
ビルボードとして表示するのでカメラ方向へ向きを変える行列を渡している。
深度値見て影描画する普通の奴。
512x512のテクスチャサイズにしている。大きすぎるかもしれない。
アラクネがアホほど出て悩んだけど、影用の深度値を記録するときにモデルの裏表を逆にする手法でかなり改善できた。
影の描画にすこしランダムを使ってみている。
ランダムには
http://neareal.net/index.php?ComputerGraphics%2FHLSL%2FCommon%2FGenerateRandomNoiseInPixelShader を使っている。
奥行情報の取得にZバッファを渡して、そこからビュー空間のZにしている。
https://stackoverflow.com/questions/32227283/getting-world-position-from-depth-buffer-value
を参考にした。
プロジェクション行列の逆行列を使ってworld*view*projからworld*viewの情報にする。
■FXAA
http://dolpetticoat.blog.fc2.com/blog-entry-103.html
のサイトさんのをそのまま使っている。
■フォンシェーダ
https://www.cnblogs.com/X-Jun/p/9028764.html
のBasic_PSわりとそのまま使っている。
ただそのまま使うとうまく動かないところがあったのでちょっといじっている。まず頂点シェーダの部分、
■歪みエフェクト
歪みエフェクト?用のシェーダ。
まるで何を参考にしていいのかわからんので、バンプマップの処理をもってきている。
後、見た目いい感じにするべく-1をかけて反転してみてみたりしている。
テクスチャはBlenderのNormalベイクで作成。
■スカイキューブ
10年ぐらい前に書いたスカイキューブ用のシェーダをかねがねそのまま持ってきてた。
データはDirectXSDKからそのまま拝借した。
以下、頂点シェーダとピクセルシェーダ。
■インスタンシングスプライト
敵弾等をインスタンシングで描画する。
メッシュにサイズが1x1、uvも0->1のものを使用してインスタンシング用データで加工して描画している。
インスタンシング用データには
位置大きさ回転:float4x4 world
頂点カラー:float4 colorInstance
uv: uvInstance, uv2Instance
の情報を持たせてテクスチャのス来たところを好きな大きさ回転角度で描画できるようにしてみている。
一番難解なのがInputLayoutをどう書けばいいのかよくわからないところだった。
■SamplingAnistropic
割と簡単に使用できた。角度が急な面の描写がしっかりした感じになる。
検索すると重いとでてくるが自分の環境と状況では特に処理負担に変化は見られなかったが、一応オンオフできるようにしている。
■音まわり
DirectX11にはDirectSoundがないのでXAudio2で作り直す必要があった。
曲再生で停止してすぐ再生したらFlushSourceBuffers()してても前のバッファが残ってしまう問題が発生したので、
あきらめて曲の停止をしたらDestroyVoice()して、再生時にいちいちCreateSourceVoice()するようにして解決した。
staticLibraryが好きなのでoggVorbisを最新にしたりちまちまとした作業が必要だった。
■xinput
いままではWinAPIでキーやゲームパッドの入力をみていたが、今回はDirectXでチェックしてみてみた。
ゲームパッド周りはXInputの便利関数が用意されているので、WinAPIよりもさらに簡単に入力を取得できる。
■directInput_key
キーボード入力はDirrectInputを使った。
ちょっとひっかかったところはDirectInputKeyboardの配列がVKではなく独自のDIKを使用する部分だった。Windowsになれすぎている。
■そのほかよく使う処理とか、調べたときよくわからなかった記述方法とか。
■行列計算
■ビルボード行列
これをビルボード表示したいオブジェクトのワールド行列に混ぜて使う。
■シェーダ用コンスタントバッファ作成
メモリ確保の段階でサイズ補正すればいいらしいと、ほかのソースコード眺めてて発見した。
■テクスチャ読み込み
■レンダーターゲットテクスチャ作成
ID3D11ShaderResourceViewはテクスチャとして使用するときに使用。
ID3D11UnorderedAccessViewはComputeShaderで使用する。
ここらへんのソースコードはDirectXSDKのほぼそのまま。
■深度テクスチャ作成
https://youtu.be/98rSC9a0LvY
http://www.rastertek.com/tutdx11.html
基本的にこのサイトさんを中心にDirectX11を触ってた。
■メモリ
ゲームオブジェクト用のメモリ領域を保持管理するために、メモリプールクラスを作った。
メモリ断片化を防ぐ狙いだけど、今のところそこまで長時間使用したことがないので効果のほどはわからない。
patriotDark、ring^-27、LUXでもメモリ管理はしていたけど、今回ちょっと仕組みをいじくって新調した。
メモリを返却時に前後のメモリ使用状況をみて結合する。
■パックファイル
複数ファイルを一ファイルにまとめる仕組み。
ZIPファイル構造をまねして、ファイル一覧情報を終端に置いた。
各ファイル内容をメモリに保持することなく記述できるし、読み込み時のファイル一覧取得もパックファイル終端だけを読めば取得できるので負担が小さめ。
ファイル書き込み時に圧縮して保存するオプションをついでにつけてみたけど、今のところ使ってない。
■mesh
http://www.rastertek.com/dx11tut08.html
をそのまま使って読み込みを行い、バイナリにして出力するツールを作成、メインプログラムでバイナリを読み込んで表示までもっていっている。
.objはBlenderでも出力できるので制作環境を変えずに済んでいる。
■ブラーシェーダ
よくある2パスつかって、コンピュートシェーダで縦横ぼかすやつ。
https://sites.google.com/site/monshonosuana/directxno-hanashi-1/directx-109
もんしょさんところにあった各ピクセルをgroupsharedメモリに一旦ためるプログラムを拝借した。
参照するテクスチャと書き込むテクスチャの大きさが違っても動くようにしている。
ピクセル位置計算がすごい雑だが、まあぼかすからいいよねって感じに雑にしている。
ブラーシェーダはDOFとブルームに使用。
DOF用のブラーはメイン画面の半分のサイズで速度とボケ具合を稼いでいる。
#define BLOCK_SIZE (16)
#define GROUP_THREADS (BLOCK_SIZE*BLOCK_SIZE)
cbuffer WeightBufferType : register( c0 )
{
float gWeight0;
float gWeight1;
float gWeight2;
float gWeight3;
float gWeight4;
int gIsHorizon;
float2 gSrcImageSize;
float2 gDestImageSize;
float padding;
float padding1;
};
Texture2D gColorTexture : register( t0 );
RWTexture2D<float4> rwTexture : register( u0 );
groupshared float4 shColor[BLOCK_SIZE * BLOCK_SIZE * 4];
uint2 GetInputPixelIndex( int2 basePos, int2 pos )
{
float2 uv = float2( basePos + pos ) / gDestImageSize;
uv = clamp( uv * gSrcImageSize, 0, gSrcImageSize-1 );
return uint2( uv );
}
[numthreads( BLOCK_SIZE, BLOCK_SIZE, 1 )]
void main(
uint3 DTid : SV_DispatchThreadID,
uint3 GTid : SV_GroupThreadID,
uint3 Gid : SV_GroupID )
{
int2 basePos = Gid.xy * BLOCK_SIZE - (BLOCK_SIZE / 2);
uint indexX = GTid.y * ( BLOCK_SIZE * 2 ) + GTid.x;
uint indexY = ( GTid.y + BLOCK_SIZE ) * ( BLOCK_SIZE * 2 ) + GTid.x;
shColor[indexX] = gColorTexture[GetInputPixelIndex( basePos, GTid.xy )];
shColor[indexX + BLOCK_SIZE] = gColorTexture[GetInputPixelIndex( basePos, GTid.xy + uint2( BLOCK_SIZE, 0 ) )];
shColor[indexY] = gColorTexture[GetInputPixelIndex( basePos, GTid.xy + uint2( 0, BLOCK_SIZE ) )];
shColor[indexY + BLOCK_SIZE] = gColorTexture[GetInputPixelIndex( basePos, GTid.xy + uint2( BLOCK_SIZE, BLOCK_SIZE ) )];
GroupMemoryBarrierWithGroupSync();
if ( gIsHorizon )
{
// 水平ブラー計算してテクスチャにいったん書込み
int2 pos = GTid.xy + ( BLOCK_SIZE / 2 );
float4 color = shColor[pos.y * ( BLOCK_SIZE * 2 ) + pos.x] * gWeight0;
float w[5];
w[0] = 0;
w[1] = gWeight1;
w[2] = gWeight2;
w[3] = gWeight3;
w[4] = gWeight4;
for ( int dist = 1; dist <= 4; dist++ )
{
color += shColor[pos.y * ( BLOCK_SIZE * 2 ) + pos.x + dist] * w[dist];
color += shColor[pos.y * ( BLOCK_SIZE * 2 ) + pos.x - dist] * w[dist];
}
rwTexture[DTid.xy] = color;
}
else
{
int2 pos = GTid.xy + ( BLOCK_SIZE / 2 );
float4 color = shColor[pos.y * ( BLOCK_SIZE * 2 ) + pos.x] * gWeight0;
float w[5];
w[0] = 0;
w[1] = gWeight1;
w[2] = gWeight2;
w[3] = gWeight3;
w[4] = gWeight4;
// 縦ブラー計算してテクスチャに書き込み
for ( int dist = 1; dist <= 4; dist++ )
{
color += shColor[( pos.y + dist ) * ( BLOCK_SIZE * 2 ) + pos.x] * w[dist];
color += shColor[( pos.y - dist ) * ( BLOCK_SIZE * 2 ) + pos.x] * w[dist];
}
rwTexture[DTid.xy] = color;
}
}
[2022/03/31]GetInputPixelIndex()がうまく動作してないのをサイレント修正。■ブライトシェーダ
一定の明るさ以上の部分を抜き出す。明るさ計算にグレースケールにして計算して、一定以下ならアルファを0にしている。
ブルームさせたい部位があるオブジェクトのために、マルチレンダーダーゲット可能なようメイン画面と同じサイズのテクスチャにしている。
float4 main( PixelInputType input ) : SV_TARGET
{
float4 color = shaderTexture.Sample( ss, input.tex ) * input.color;
float brightness = dot( color.rgb, float3( 0.2126, 0.7152, 0.0722 ) );
float a = saturate( 1 - step( brightness, bright ) );
return float4( color.xyz, a );
}
■ブルームシェーダ
ブライトシェーダで抜き出した明るい部分をテクスチャ縮小しながら3枚作成して、それぞれスクリーン合成した。
最初は4枚合成してたけど、あまりにも重いので3枚に減らした。
1枚目がメイン画面の1/4、2枚目が1/8、3枚目が1/16のサイズ。
Texture2D gColorTexture1 : register( t0 );
Texture2D gColorTexture2 : register( t1 );
Texture2D gColorTexture3 : register( t2 );
//Texture2D gColorTexture4 : register( t3 );
SamplerState ss : register( s0 );
float4 main( PixelInputType input ) : SV_TARGET
{
float4 c1 = gColorTexture1.Sample( ss, input.tex ) * gBloomWeight1;
float4 c2 = gColorTexture2.Sample( ss, input.tex ) * gBloomWeight2;
float4 c3 = gColorTexture3.Sample( ss, input.tex ) * gBloomWeight3;
//float4 c4 = gColorTexture4.Sample( ss, input.tex ) * gBloomWeight4;
float4 c = c1 + c2 - c1*c2;
c = c + c3 - c*c3;
//c = c + c4 - c*c4;
c = saturate( c );
return c * gBloomMasterWeight;
}
■ポストエフェクト用の頂点シェーダ
https://hikita12312.hatenablog.com/entry/2018/01/25/230502
を参考に、画面全体を書き換える用の頂点シェーダを作成、使用している。
ポリゴンの表裏が違うのかうまく描画できなかったのでちょっといじっている。
PixelInputType main( uint index : SV_VertexID )
{
PixelInputType output;
float2 vID = float2( index % 2, index / 2 ); //< (0,0)(1,0)(0,1)
float2 pos = float2( 4, -4 ) * vID.xy + float2( -1, 1 ); //< (-1,1)(-3,1)(-1,3)
output.pos = float4( pos, 0, 1 );
output.tex = float2( 2, 2 ) * vID.xy; //< (0,0)(2,0)(0,2)
return output;
}
あと、画面回転に対応するために、回転可能なのも使っている。大した計算コストでもないだろうから下だけでいいかもしれない。
PixelInputType main( uint index : SV_VertexID )
{
PixelInputType output;
float2 vID = float2( index % 2, index / 2 ); //< (0,0)(1,0)(0,1)
float2 pos = float2( 4, -4 ) * vID.xy + float2( -1, 1 ); //< (-1,1)(3,1)(-1,-3)
float2 rotatePos;
rotatePos.x = cos( gRotateAngle ) * pos.x - sin( gRotateAngle ) * pos.y;
rotatePos.y = sin( gRotateAngle ) *pos.x + cos( gRotateAngle ) * pos.y;
output.pos = float4( rotatePos, 0, 1 );
output.tex = float2( 2, 2 ) * vID.xy; //< (0,0)(2,0)(0,2)
return output;
}
■CPUパーティクル
世間ではGPUパーティクルが主流だけど。
頂点を生成して頂点シェーダ→ジオメトリシェーダ→ピクセルシェーダで描画する方法を使っている。
下は、一頂点から2ポリゴン生成するジオメトリシェーダ。
ビルボードとして表示するのでカメラ方向へ向きを変える行列を渡している。
[maxvertexcount(6)]
void main( point GeometryInputType input[1], inout TriangleStream<PixelInputType> outStream )
{
float billboardSize = input[0].pos.w;
float3 billboardPos[6];
billboardPos[0] = mul( float3( -0.5f, -0.5f, 0 ), ( float3x3 )gBillboard ).xyz * billboardSize;
billboardPos[1] = mul( float3( -0.5f, 0.5f, 0 ), ( float3x3 )gBillboard ).xyz * billboardSize;
billboardPos[2] = mul( float3( 0.5f, -0.5f, 0 ), ( float3x3 )gBillboard ).xyz * billboardSize;
billboardPos[3] = billboardPos[2];
billboardPos[4] = billboardPos[1];
billboardPos[5] = mul( float3( 0.5f, 0.5f, 0 ), ( float3x3 )gBillboard ).xyz * billboardSize;
float2 uv[6];
uv[0] = float2( 0, 0 );
uv[1] = float2( 0, 1 );
uv[2] = float2( 1, 0 );
uv[3] = float2( 1, 0 );
uv[4] = float2( 0, 1 );
uv[5] = float2( 1, 1 );
{
int j;
for ( j=0; j<3; j++)
{
PixelInputType output;
output.pos = float4( input[0].pos.xyz, 1 );
output.pos.xyz += billboardPos[j];
output.pos = mul( output.pos, gWorld );
output.pos = mul( output.pos, gView );
output.pos = mul( output.pos, gProjection );
output.color = input[0].color;
output.tex = uv[j];
outStream.Append( output );
}
outStream.RestartStrip();
for ( j = 3; j<6; j++ )
{
PixelInputType output;
output.pos = float4( input[0].pos.xyz, 1 );
output.pos.xyz += billboardPos[j];
output.pos = mul( output.pos, gWorld );
output.pos = mul( output.pos, gView );
output.pos = mul( output.pos, gProjection );
output.color = input[0].color;
output.tex = uv[j];
outStream.Append( output );
}
outStream.RestartStrip();
}
}
■影深度値見て影描画する普通の奴。
512x512のテクスチャサイズにしている。大きすぎるかもしれない。
アラクネがアホほど出て悩んだけど、影用の深度値を記録するときにモデルの裏表を逆にする手法でかなり改善できた。
影の描画にすこしランダムを使ってみている。
ランダムには
http://neareal.net/index.php?ComputerGraphics%2FHLSL%2FCommon%2FGenerateRandomNoiseInPixelShader を使っている。
float GetRandomNumber( float2 texCoord, int Seed )
{
return frac( sin( dot( texCoord.xy, float2( 12.9898, 78.233 ) ) + Seed ) * 43758.5453 );
}
float CalcShadowFactor( float4 shadowPosH )
{
shadowPosH.xyz /= shadowPosH.w;
float shadowBias = 0.001f;
float depth = shadowPosH.z;
float percentLit = 0.0f;
const int NUM_OF_SAMPLING = 2; //< サンプリング数
const float DIST_OF_SAMPLING = 2; //< サンプリング最大距離
percentLit += gShadowTexture.SampleCmpLevelZero( samShadow, shadowPosH.xy, depth - shadowBias ).r;
for ( int i = 0; i < NUM_OF_SAMPLING; ++i )
{
float rndX = ( GetRandomNumber( shadowPosH.xy, i ) - 0.5f ) * ( (1 / gShadowTexSize.x) * DIST_OF_SAMPLING );
float rndY = ( GetRandomNumber( shadowPosH.xy, i + 29 ) - 0.5f ) * ( ( 1 / gShadowTexSize.y ) * DIST_OF_SAMPLING );
percentLit += gShadowTexture.SampleCmpLevelZero( samShadow, shadowPosH.xy + float2(rndX, rndY), depth - shadowBias ).r;
}
return percentLit / ( NUM_OF_SAMPLING + 1 );
}
■DOF奥行情報の取得にZバッファを渡して、そこからビュー空間のZにしている。
https://stackoverflow.com/questions/32227283/getting-world-position-from-depth-buffer-value
を参考にした。
プロジェクション行列の逆行列を使ってworld*view*projからworld*viewの情報にする。
float3 depthToViewPos( float2 tex )
{
float4 clipSpacePos;
clipSpacePos.x = tex.x * 2 - 1; //< 0~1 -> -1~1
clipSpacePos.y = -tex.y * 2 + 1; //< 0~1 -> -1~1ただし上が1になって下が-1になる
clipSpacePos.z = gDepthTexture.Sample( ss, tex ).r;
clipSpacePos.w = 1;
float4 pos = mul( clipSpacePos, gInvProj );
pos /= pos.w;
return pos.xyz;
}
あとは普通の画像とぼかした画像からいい感じに距離に応じてボケてみえるようにするだけだが、手前がぼけておくがくっきりしているの対策に、上下左右の奥行情報をさらに取得してボケ範囲を広くしてみている。もうちょいましな方法がある気がするけど。
float4 main( PixelInputType input ) : SV_TARGET
{
const float SAMPLING_DIST = 4;
float z = depthToViewPos( input.tex ).z;
float z1 = depthToViewPos( input.tex + float2( SAMPLING_DIST / gDestImageWidth, 0 ) ).z;
float z2 = depthToViewPos( input.tex + float2( -SAMPLING_DIST / gDestImageWidth, 0 ) ).z;
float z3 = depthToViewPos( input.tex + float2( 0, SAMPLING_DIST / gDestImageHeight ) ).z;
float z4 = depthToViewPos( input.tex + float2( 0, -SAMPLING_DIST / gDestImageHeight ) ).z;
float mostNear = min( z4, min( z3, min( z1, z2 ) ) );
z = z < gFocusZ ? ( z + mostNear ) / 2 : z;
float dist = abs( z - gFocusZ );
float blend = saturate( ( dist - gStartBlurRange ) / ( gEndBlurRange - gStartBlurRange ) );
float3 colorA = gColorTexture.Sample( ss, input.tex ).rgb;
float3 colorB = gBlurTexture.Sample( ss, input.tex ).rgb;
return float4( lerp( colorA, colorB, blend ), 1 );
}
■FXAA
http://dolpetticoat.blog.fc2.com/blog-entry-103.html
のサイトさんのをそのまま使っている。
■フォンシェーダ
https://www.cnblogs.com/X-Jun/p/9028764.html
のBasic_PSわりとそのまま使っている。
ただそのまま使うとうまく動かないところがあったのでちょっといじっている。まず頂点シェーダの部分、
output.normalW = mul( input.normal, ( float3x3 )input.invWorld );
output.tangentW = mul( input.tangent, ( float3x3 )world );に、あとピクセルシェーダのDirectLightの部分、
float3 lightVec = -L.direction;
float3 lightVec = L.direction;にした。なんかしら渡すパラメータが間違えてるんだろうたぶん。
PixelInputType main( VertexInputType input )
{
PixelInputType output;
float4x4 world = mul( input.world, gWorld );
output.pos = mul( float4(input.pos, 1), world );
output.posW = output.pos;
output.pos = mul( output.pos, gView );
output.pos = mul( output.pos, gProjection );
output.tex = input.tex;
output.normalW = mul( input.normal, (float3x3)world );
//output.normalW = mul( input.normal, ( float3x3 )input.invWorld );
output.tangentW = mul( input.tangent, ( float3x3 )world );
output.binormalW = mul( input.binormal, ( float3x3 )world );
output.normalW = normalize( output.normalW );
output.tangentW = normalize( output.tangentW );
output.binormalW = normalize( output.binormalW );
output.shadowPosH = mul( output.posW, gShadowTransform );
return output;
}
void ComputeDirectionalLight( Material mat, DirectionalLight L,
float3 normal, float3 toEye,
out float4 ambient,
out float4 diffuse,
out float4 spec )
{
// 初期化
ambient = float4( 0.0f, 0.0f, 0.0f, 0.0f );
diffuse = float4( 0.0f, 0.0f, 0.0f, 0.0f );
spec = float4( 0.0f, 0.0f, 0.0f, 0.0f );
//float3 lightVec = -L.direction;
float3 lightVec = L.direction;
ambient = mat.ambient * L.ambient;
float diffuseFactor = dot( lightVec, normal );
[flatten]
if ( diffuseFactor > 0.0f )
{
float3 v = reflect( -lightVec, normal );
float specFactor = pow( max( dot( v, toEye ), 0.0f ), mat.specular.w );
diffuse = diffuseFactor * mat.diffuse * L.diffuse;
spec = saturate(specFactor * mat.specular * L.specular);
}
}
点光源が範囲くっきり照らされてるようだったので遠くほどひからなくなる処理を入れている。
void ComputePointLight( Material mat, PointLight L, float3 pos, float3 normal, float3 toEye,
out float4 ambient, out float4 diffuse, out float4 spec )
{
ambient = float4( 0.0f, 0.0f, 0.0f, 0.0f );
diffuse = float4( 0.0f, 0.0f, 0.0f, 0.0f );
spec = float4( 0.0f, 0.0f, 0.0f, 0.0f );
float3 lightVec = L.position - pos;
float d = length( lightVec );
if ( d > L.range )
return;
lightVec /= d;
ambient = mat.ambient * L.ambient * ( 1 - d / L.range );;
// 効果範囲で徐々に減光するようにする
float diffuseFactor = dot( lightVec, normal );
[flatten]
if ( diffuseFactor > 0.0f )
{
float3 v = reflect( -lightVec, normal );
float specFactor = pow( max( dot( v, toEye ), 0.0f ), mat.specular.w );
diffuse = diffuseFactor * mat.diffuse * L.diffuse;
spec = specFactor * mat.specular * L.specular;
}
float att = 1.0f / dot( L.att, float3( 1.0f, d, d * d ) );
// 効果範囲で徐々に減光するようにする
att *= ( 1 - d / L.range );
diffuse *= att;
spec *= att;
}
あとフォグ欲しかったのでつけ足してみたりしている。
float fogLerp = saturate( ( distToEye - gFogStart ) / ( gFogEnd - gFogStart ) );
litColor = lerp( litColor, gFogColor, fogLerp );
意外に描画処理が重いので遠くのノーマルマップは無視するとかの軽量化の必要を感じている。■歪みエフェクト
歪みエフェクト?用のシェーダ。
まるで何を参考にしていいのかわからんので、バンプマップの処理をもってきている。
後、見た目いい感じにするべく-1をかけて反転してみてみたりしている。
テクスチャはBlenderのNormalベイクで作成。
float4 main( PixelInputType input ) : SV_TARGET
{
float4 normalMap = normalTexture.Sample( ss, input.tex );
clip( normalMap.a - 0.1f );
float2 refractTexCoord;
refractTexCoord.x = input.refractionPos.x / input.refractionPos.w / 2.0f + 0.5f;
refractTexCoord.y = -input.refractionPos.y / input.refractionPos.w / 2.0f + 0.5f;
float3 normal = ( normalMap.xyz * 2.f ) - 1.0f;
normal *= -1;
refractTexCoord = refractTexCoord + ( normal.xy * gRefractionScale );
float4 color = colorTexture.Sample( ss, refractTexCoord );
return float4( color.rgb, 1 ) * input.color;
}
■スカイキューブ
10年ぐらい前に書いたスカイキューブ用のシェーダをかねがねそのまま持ってきてた。
データはDirectXSDKからそのまま拝借した。
以下、頂点シェーダとピクセルシェーダ。
cbuffer MatrixBuffer : register( b0 )
{
float4x4 world;
float4x4 view;
float4x4 projection;
};
PixelInputType main( VertexInputType input )
{
PixelInputType output;
float4x4 matNoTransView = {
view[0],
view[1],
view[2],
float4( 0.f, 0.f, 0.f, 1.f )
};
output.pos = mul( float4( input.pos, 1 ), mul( matNoTransView, projection ) );
output.tex = input.pos;
return output;
}
float4 main( PixelInputType input ) : SV_TARGET
{
return cubeTexture.Sample( SampleType, input.tex );
}
■インスタンシングスプライト
敵弾等をインスタンシングで描画する。
メッシュにサイズが1x1、uvも0->1のものを使用してインスタンシング用データで加工して描画している。
インスタンシング用データには
位置大きさ回転:float4x4 world
頂点カラー:float4 colorInstance
uv: uvInstance, uv2Instance
の情報を持たせてテクスチャのス来たところを好きな大きさ回転角度で描画できるようにしてみている。
一番難解なのがInputLayoutをどう書けばいいのかよくわからないところだった。
D3D11_INPUT_ELEMENT_DESC vertexDesc[] = {
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "world", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 0, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
{ "world", 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
{ "world", 2, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
{ "world", 3, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
{ "TEXCOORD", 1, DXGI_FORMAT_R32G32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
{ "TEXCOORD", 2, DXGI_FORMAT_R32G32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
};
cbuffer MatrixBuffer : register( b0 )
{
float4x4 g_world;
float4x4 g_view;
float4x4 g_projection;
};
struct VertexInputType
{
float3 pos : POSITION0;
float2 tex : TEXCOORD0;
float4x4 world : world;
float4 colorInstance : COLOR0;
float2 uvInstance : TEXCOORD1; //< uv始点
float2 uv2Instance : TEXCOORD2; //< uv終点
};
struct PixelInputType
{
float4 pos : SV_POSITION;
float4 color : COLOR0;
float2 tex : TEXCOORD0;
};
PixelInputType main( VertexInputType input )
{
PixelInputType output;
float4x4 mat = mul( g_world, input.world );
output.pos = mul( float4( input.pos, 1 ), mat );
output.pos = mul( output.pos, g_view );
output.pos = mul( output.pos, g_projection );
output.color = input.colorInstance;
float texWidth = input.uv2Instance.x - input.uvInstance.x;
float texHeight = input.uv2Instance.y - input.uvInstance.y;
output.tex.x = input.uvInstance.x + texWidth * input.tex.x;
output.tex.y = input.uvInstance.y + texHeight * input.tex.y;
return output;
}
■SamplingAnistropic
割と簡単に使用できた。角度が急な面の描写がしっかりした感じになる。
検索すると重いとでてくるが自分の環境と状況では特に処理負担に変化は見られなかったが、一応オンオフできるようにしている。
■音まわり
DirectX11にはDirectSoundがないのでXAudio2で作り直す必要があった。
曲再生で停止してすぐ再生したらFlushSourceBuffers()してても前のバッファが残ってしまう問題が発生したので、
あきらめて曲の停止をしたらDestroyVoice()して、再生時にいちいちCreateSourceVoice()するようにして解決した。
staticLibraryが好きなのでoggVorbisを最新にしたりちまちまとした作業が必要だった。
■xinput
いままではWinAPIでキーやゲームパッドの入力をみていたが、今回はDirectXでチェックしてみてみた。
ゲームパッド周りはXInputの便利関数が用意されているので、WinAPIよりもさらに簡単に入力を取得できる。
class XInputWrapper
{
public:
// 使用するコントローラの番号を指定する0~3
XInputWrapper( int controllerNo )
: m_controllerNo( controllerNo )
{
ZeroMemory( &m_inputState, sizeof( m_inputState ) );
}
void update()
{
XInputGetState( m_controllerNo, &m_inputState );
}
// -1 ~ 1
// 閾値以下なら触っていないようにする処理が別に必要だが、とりあえずデータの取り方だけ見ておく
float getStickLeftX() const { return static_cast<float>( m_inputState.Gamepad.sThumbLX ) / 32767; }
float getStickLeftY() const { return static_cast<float>( m_inputState.Gamepad.sThumbLY ) / 32767; }
float getStickRightX() const { return static_cast<float>( m_inputState.Gamepad.sThumbRX ) / 32767; }
float getStickRightY() const { return static_cast<float>( m_inputState.Gamepad.sThumbRY ) / 32767; }
float getTriggerLeft() const { return static_cast<float>( m_inputState.Gamepad.bLeftTrigger ) / 255; }
float getTriggerRight() const { return static_cast<float>( m_inputState.Gamepad.bRightTrigger ) / 255; }
bool getUp() const { return m_inputState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP; }
bool getDown() const { return m_inputState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN; }
bool getLeft() const { return m_inputState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT; }
bool getRight() const { return m_inputState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT; }
bool getStartButton() const { return m_inputState.Gamepad.wButtons & XINPUT_GAMEPAD_START; }
bool getBackButton() const { return m_inputState.Gamepad.wButtons & XINPUT_GAMEPAD_BACK; }
// スティック押し込み
bool getThubLeft() const { return m_inputState.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB; }
bool getThubRight() const { return m_inputState.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB; }
// LRボタン
bool getShoulderLeft() const { return m_inputState.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER; }
bool getShoulderRight() const { return m_inputState.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER; }
bool getButtonA() const { return m_inputState.Gamepad.wButtons & XINPUT_GAMEPAD_A; }
bool getButtonB() const { return m_inputState.Gamepad.wButtons & XINPUT_GAMEPAD_B; }
bool getButtonX() const { return m_inputState.Gamepad.wButtons & XINPUT_GAMEPAD_X; }
bool getButtonY() const { return m_inputState.Gamepad.wButtons & XINPUT_GAMEPAD_Y; }
// 設定した振動値にする
void setVibration( WORD leftMoterSpeed, WORD rightMoterSpeed )
{
XINPUT_VIBRATION vibration;
vibration.wLeftMotorSpeed = leftMoterSpeed;
vibration.wRightMotorSpeed = rightMoterSpeed;
XInputSetState( m_controllerNo, &vibration );
}
// 使用するコントローラ番号を設定
void changeControllerNo( int no )
{
// 範囲外の数値だったら0にでもしておく
if ( no > 3 || no < 0 ) no = 0;
m_controllerNo = no;
}
private:
int m_controllerNo; //< 0~3
XINPUT_STATE m_inputState;
};
ただ今家にゲームコントローラがないので動作チェックは一切できていない。うごくのこれ?■directInput_key
キーボード入力はDirrectInputを使った。
ちょっとひっかかったところはDirectInputKeyboardの配列がVKではなく独自のDIKを使用する部分だった。Windowsになれすぎている。
■そのほかよく使う処理とか、調べたときよくわからなかった記述方法とか。
■行列計算
static DirectX::XMMATRIX multiply( const DirectX::XMMATRIX& pos, const DirectX::XMMATRIX& scale, const DirectX::XMMATRIX& rotate )
{
return DirectX::XMMatrixMultiply( DirectX::XMMatrixMultiply( scale, rotate ), pos );
}
scale * posみたいに普通に記述も可能だけど計算順序が安定しないので素直に乗算用の関数を使用するようにしている。■ビルボード行列
static DirectX::XMMATRIX calcBillboardMat( const DirectX::XMFLOAT4X4& view )
{
DirectX::XMMATRIX viewMat = DirectX::XMLoadFloat4x4( &view );
viewMat = DirectX::XMMatrixInverse( NULL, viewMat );
DirectX::XMFLOAT4X4 v;
DirectX::XMStoreFloat4x4( &v, viewMat );
v._41 = 0;
v._42 = 0;
v._43 = 0;
return DirectX::XMLoadFloat4x4( &v );
}
カメラの逆行列から位置情報を削除したもの。これをビルボード表示したいオブジェクトのワールド行列に混ぜて使う。
■シェーダ用コンスタントバッファ作成
static HRESULT createConstBuffer( ID3D11Device* dx11device, ID3D11Buffer** out_pBuffer, UINT size )
{
// 16の倍数にする
size += 15;
size &= ( ~15 );
D3D11_BUFFER_DESC desc = { 0 };
desc.ByteWidth = size;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;
desc.StructureByteStride = 0;
return dx11device->CreateBuffer( &desc, NULL, out_pBuffer );
}
>/code>
しばらく勉強用サイトにならってpaddingデータを詰めた構造体を定義して使っていたけど、メモリ確保の段階でサイズ補正すればいいらしいと、ほかのソースコード眺めてて発見した。
■テクスチャ読み込み
HRESULT create( ID3D11Device* dx11device, LPCTSTR imageFilePath )
{
HRESULT hResult = S_FALSE;
if ( Utility::checkExtension( imageFilePath, TEXT( ".dds" ) ) )
{
hResult = DirectX::CreateDDSTextureFromFile( dx11device, imageFilePath, &m_pTexture, &m_pTextureView );
}
else
{
hResult = DirectX::CreateWICTextureFromFile( dx11device, imageFilePath, &m_pTexture, &m_pTextureView );
}
return hResult;
}
ID3D11Resource* m_pTexture;
ID3D11ShaderResourceView* m_pTextureView;
DirectXTKの"DDSTextureLoader.h"と"WICTextureLoader.h"でテクスチャの読み込みが簡単にできる例。■レンダーターゲットテクスチャ作成
static HRESULT createR16G16B16A16( ID3D11Device* dx11device, UINT width, UINT height,
ID3D11Texture2D** renderTargetTexture,
ID3D11RenderTargetView** renderTargetView,
ID3D11ShaderResourceView** shaderResourceView,
ID3D11UnorderedAccessView** unorderedAccessView = NULL )
{
D3D11_TEXTURE2D_DESC texDesc = { 0 };
texDesc.Width = width;
texDesc.Height = height;
texDesc.MipLevels = 1;
texDesc.ArraySize = 1;
texDesc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT;
texDesc.SampleDesc.Count = 1;
texDesc.Usage = D3D11_USAGE_DEFAULT;
texDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE | (unorderedAccessView ? D3D11_BIND_UNORDERED_ACCESS : 0);
texDesc.CPUAccessFlags = 0;
texDesc.MiscFlags = 0;
HRESULT hResult = dx11device->CreateTexture2D( &texDesc, NULL, renderTargetTexture );
if ( FAILED( hResult ) ) return hResult;
D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
ZeroMemory( &renderTargetViewDesc, sizeof( renderTargetViewDesc ) );
renderTargetViewDesc.Format = texDesc.Format;
renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
renderTargetViewDesc.Texture2D.MipSlice = 0;
hResult = dx11device->CreateRenderTargetView( *renderTargetTexture, &renderTargetViewDesc, renderTargetView );
if ( FAILED( hResult ) ) return hResult;
D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc;
ZeroMemory( &shaderResourceViewDesc, sizeof( shaderResourceViewDesc ) );
shaderResourceViewDesc.Format = texDesc.Format;
shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;
shaderResourceViewDesc.Texture2D.MipLevels = 1;
hResult = dx11device->CreateShaderResourceView( *renderTargetTexture, &shaderResourceViewDesc, shaderResourceView );
if ( FAILED( hResult ) ) return hResult;
if ( unorderedAccessView )
{
D3D11_UNORDERED_ACCESS_VIEW_DESC uavDesc;
ZeroMemory( &uavDesc, sizeof( uavDesc ) );
uavDesc.Format = DXGI_FORMAT_UNKNOWN;
uavDesc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D;
hResult = dx11device->CreateUnorderedAccessView( *renderTargetTexture, &uavDesc, unorderedAccessView );
if ( FAILED( hResult ) ) return false;
}
return hResult;
}
ID3D11RenderTargetViewは描画先に指定するときに使用。ID3D11ShaderResourceViewはテクスチャとして使用するときに使用。
ID3D11UnorderedAccessViewはComputeShaderで使用する。
ここらへんのソースコードはDirectXSDKのほぼそのまま。
■深度テクスチャ作成
static HRESULT createR32( ID3D11Device* dx11device, UINT width, UINT height,
ID3D11Texture2D** depthTexture,
ID3D11DepthStencilView** depthTextureView,
ID3D11ShaderResourceView** depthTextureSRV )
{
D3D11_TEXTURE2D_DESC txDesc = { 0 };
txDesc.Width = width;
txDesc.Height = height;
txDesc.MipLevels = 1;
txDesc.ArraySize = 1;
txDesc.Format = DXGI_FORMAT_R32_TYPELESS;
txDesc.SampleDesc.Count = 1;
txDesc.SampleDesc.Quality = 0;
txDesc.Usage = D3D11_USAGE_DEFAULT;
txDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE;
txDesc.CPUAccessFlags = 0;
txDesc.MiscFlags = 0;
HRESULT hResult = dx11device->CreateTexture2D( &txDesc, NULL, depthTexture );
if ( FAILED( hResult ) ) return hResult;
D3D11_DEPTH_STENCIL_VIEW_DESC dsDesc = { txDesc.Format };
dsDesc.Format = DXGI_FORMAT_D32_FLOAT;
dsDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
dsDesc.Texture2D.MipSlice = 0;
hResult = dx11device->CreateDepthStencilView( *depthTexture, &dsDesc, depthTextureView );
if ( FAILED( hResult ) ) return hResult;
D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc;
ZeroMemory( &shaderResourceViewDesc, sizeof( shaderResourceViewDesc ) );
shaderResourceViewDesc.Format = DXGI_FORMAT_R32_FLOAT;
shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;
shaderResourceViewDesc.Texture2D.MipLevels = 1;
hResult = dx11device->CreateShaderResourceView( *depthTexture, &shaderResourceViewDesc, depthTextureSRV );
return hResult;
}
2021年6月2日水曜日
Fスクリーンキーボード ver3.00a
■ダウンロード
File: fkey300a.zip
Size: 677KB
分類: フリーソフト
MD5: 21cdb3dbf534ab7133c2247e959a54b0
■概要
スクリーンキーボードにフリック機能をつけて、ctrlやshiftへのカーソル移動の手間を少し減らすことができます。
従来の日本語キーボードの他に、日本語フリック入力用のレイアウトや、テンキーや50音キーボードなども使用できます。
■動作環境
Windows 10
CPU 2GHz以上
メモリ 4GB以上
■アンインストール
レジストリは触っておりません。
削除の際はフォルダごとゴミ箱へ。
■使い方
・表示されているキーを左クリックすることでキー入力できます。
・フリック(クリックしたままカーソルを移動し、指を離す)することで
ShiftやCtrlキーを付加したり、関連したキーを押すことができます。
・右クリックフリックで最小化やコンフィグ表示、レイアウト変更などを行うことができます。
右クリックフリックは設定で自由に変更できます
詳しくはhelp.htmlを参照してください。
■そのほか
このソフトウェアを使用し、何らかの障害が発生しても責任を取りかねますのでご了承ください。
■更新履歴
2021-06-02 ver 3.00a
テンキーexの追加。
スキャンコード使用時のコードが間違ってるのを修正-
2021-02-07 ver 3.00
2021年3月16日火曜日
pointClick ver 2.00c
■ダウンロード
File: pointClick200c.zip
Size: 67.6KB
分類: フリーソフト
MD5: 787ce10ba85f55f2f348d92f03563cc6
■概要
クリックしたときに、マウスがちょっと動いてしまってドラッグ&ドロップになってしまうのを防ぎます。
■動作環境
Windows 10
CPU 2GHz以上
メモリ 2GB以上
■アンインストール
レジストリは触っておりません。
削除の際はフォルダごとゴミ箱へ。
■使い方
起動中、クリック開始位置と終了位置が近ければカーソル位置を補正するようになります。
不要になったら終了してください。
■ver1台との違い
クリックに情報を乗せられることに気が付いたので、それを利用してプログラムをシンプルにしました。
マウスのボタンを押してからクリックさせるまでの間に、クリック先ウィンドウが補正機能対象かチェックするようにしました
権限が上と思われるソフトに対して、全機能がオフになる処理を入れました
■設定の説明
○マスター on/off
オフにすると補正機能が動かなくなります。一時的に補正したくないときなどに。
○左クリック、ホイールクリック、右クリック
チェックがついているものだけ補正機能が働きます。
○有効時間
マウスのボタンを押してから離すまでの時間設定
設定した時間よりも長くマウスのボタンを押されていると、位置補正機能は働きません
○有効距離
マウスのボタンを押してから離すまでに移動した距離の設定
設定した距離よりも長く移動していたら、位置補正機能は働きません
○クリック時間
補正機能が実行されたときにクリックされている時間の設定
いくつかのアプリケーションではクリック時間が短すぎるとクリックされたと認識しないことがあります。
○有効アプリを限定する
補正機能が働くアプリケーションを限定することができます
○アプリ選択
補正機能が働くアプリケーションを選択できます
○ログ表示
補正機能が働いたかどうかのログを表示します
○ログ表示数
ログを表示する数の設定
■そのほか
このソフトウェアを使用し、何らかの障害が発生しても責任を取りかねますのでご了承ください。
■更新履歴
2021-03-08 ver 2.00c
D&D開始時の位置がずれる問題を軽減できるよう修正。他のアプリケーションの処理サイクルやPC全体の負担具合によって機能したりしなかったりします。
2020-12-17 ver 2.00b
最小化時に終了して、使い起動時に最小化状態が維持していないのを修正
2019-11-10 ver 2.00a
権限が上と思われるソフトがアクティブのときは、全機能オフにするよう修正
クリックしていないときは内部ループがゆるくなるよう修正
2019-07-14 ver 2.00
2021年2月7日日曜日
Fスクリーンキーボード ver3.00
■ダウンロード
File: fkey300.zip
Size: 675KB
分類: フリーソフト
MD5: 5d4ddecc6968cce936b4a5d0321da3a5
■概要
スクリーンキーボードにフリック機能をつけて、ctrlやshiftへのカーソル移動の手間を少し減らすことができます。
従来の日本語キーボードの他に、日本語フリック入力用のレイアウトや、テンキーや50音キーボードなども使用できます。
■動作環境
Windows 10
CPU 2GHz以上
メモリ 4GB以上
■アンインストール
レジストリは触っておりません。
削除の際はフォルダごとゴミ箱へ。
■使い方
・表示されているキーを左クリックすることでキー入力できます。
・フリック(クリックしたままカーソルを移動し、指を離す)することで
ShiftやCtrlキーを付加したり、関連したキーを押すことができます。
・右クリックフリックで最小化やコンフィグ表示、レイアウト変更などを行うことができます。
右クリックフリックは設定で自由に変更できます
詳しくはhelp.htmlを参照してください。
■そのほか
このソフトウェアを使用し、何らかの障害が発生しても責任を取りかねますのでご了承ください。
■更新履歴
2021-02-07 ver 3.00
2020年12月17日木曜日
pointClick ver 2.00b
■ダウンロード
File: pointClick200b.zip
Size: 67.5KB
分類: フリーソフト
■概要
クリックしたときに、マウスがちょっと動いてしまってドラッグ&ドロップになってしまうのを防ぎます。
■動作環境
Windows 10
CPU 2GHz以上
メモリ 2GB以上
■アンインストール
レジストリは触っておりません。
削除の際はフォルダごとゴミ箱へ。
■使い方
起動中、クリック開始位置と終了位置が近ければカーソル位置を補正するようになります。
不要になったら終了してください。
■ver1台との違い
クリックに情報を乗せられることに気が付いたので、それを利用してプログラムをシンプルにしました。
マウスのボタンを押してからクリックさせるまでの間に、クリック先ウィンドウが補正機能対象かチェックするようにしました
権限が上と思われるソフトに対して、全機能がオフになる処理を入れました
■設定の説明
○マスター on/off
オフにすると補正機能が動かなくなります。一時的に補正したくないときなどに。
○左クリック、ホイールクリック、右クリック
チェックがついているものだけ補正機能が働きます。
○有効時間
マウスのボタンを押してから離すまでの時間設定
設定した時間よりも長くマウスのボタンを押されていると、位置補正機能は働きません
○有効距離
マウスのボタンを押してから離すまでに移動した距離の設定
設定した距離よりも長く移動していたら、位置補正機能は働きません
○クリック時間
補正機能が実行されたときにクリックされている時間の設定
いくつかのアプリケーションではクリック時間が短すぎるとクリックされたと認識しないことがあります。
○有効アプリを限定する
補正機能が働くアプリケーションを限定することができます
○アプリ選択
補正機能が働くアプリケーションを選択できます
○ログ表示
補正機能が働いたかどうかのログを表示します
○ログ表示数
ログを表示する数の設定
■そのほか
このソフトウェアを使用し、何らかの障害が発生しても責任を取りかねますのでご了承ください。
■更新履歴
2020-12-17 ver 2.00b
最小化時に終了して、使い起動時に最小化状態が維持していないのを修正
2019-11-10 ver 2.00a
権限が上と思われるソフトがアクティブのときは、全機能オフにするよう修正
クリックしていないときは内部ループがゆるくなるよう修正
2019-07-14 ver 2.00
windowCap ver1.02b
■ダウンロード
File: windowCap102.zip
Size: 140KB
分類: フリーソフト
■概要
PrintScreenが押されると、ウィンドウのスクリーンショットを撮って画像ファイルで出力します。
対応出力形式:BMP、PNG
ShiftやCtrl、Altキーの同時押しによる、キャプチャ範囲の個別設定が可能。(3つまで)
音とバルーン表示でわかりやすく出力確認。
出力ファイル名に日付を入れるといった、ちょっとだけ柔軟な名前設定もできます。
■動作環境
Windows 8.1
CPU 1GHz以上
メモリ 1GB以上
■アンインストール
レジストリは触っておりません。
削除の際はフォルダごとゴミ箱へ。
■使い方
●キー設定
スクリーンショットの撮り方と記録キーを3つまで設定できます。
○記録するウィンドウに関する設定
・なし
キーが押されても何もしません。
・デスクトップ全体
メインのデスクトップを記録します
・アクティブウィンドウ
現在アクティブなウィンドウを記録します
・アクティブウィンドウのクライアント領域
現在アクティブなウィンドウのクライアント領域を記録します
・カーソル下のウィンドウ
マウスカーソルの下にあるウィンドウを記録します
・カーソル下のウィンドウのクライアント領域
マウスカーソルの下にあるウィンドウのクライアント領域を記録します
・複数のデスクトップ全体
複数デスクトップそれぞれを別個に記録します
ファイル出力の場合、複数ファイルに出力され、
ファイル名には(1),(2)なと末尾に数値が追記されます。
クリップボード出力だとプライマリのデスクトップのみ記録されます。
・複数のデスクトップ全体を1枚に
複数のデスクトップをまとめて1枚の画像で記録します
・カーソル下のデスクトップ全体
現在カーソルがあるデスクトップを記録します
○記録キーの同時押しの設定
PrintScreenキー と同時に Shift、Ctrl、Alt キーを同時に押させるかを設定できます。
●キャプチャ設定
マウスカーソルを含める
チェックをいれると、画像にカーソルを含むことができます。
出力先
ファイルかクリップボードから選択できます。
●通知
バルーン
記録に成功したらバルーン表示でお知らせします。
音を鳴らす
記録に成功したら音を鳴らします。
実行ファイルと同フォルダにある sound.wav を置き換えて好きな音に変更してください
●ファイル設定
ファイル形式
ビットマップかPNGで画像ファイルを保存できます
上書き時に確認ウィンドウを出す
画像ファイル出力先に出力するファイル名が既に存在していたら、確認ウィンドウを出すようにします。
チェックが入っていなければ、自動的に上書きします。
出力先フォルダ
画像ファイルが出力されるフォルダを設定できます。
指定したフォルダが存在していないと出力されませんのでご注意ください。
...ボタン
フォルダ選択ウィンドウを出します。出力したいフォルダを選択してください。
出力先フォルダを開く
設定したフォルダを開きます。
指定フォルダが存在してないと、グレー表示になり押すことができなくなります。
ファイル名
画像ファイル名を設定できます。
ファイル名には「\」「/」?」「*」「"」「>」「<」「|」の文字は設定できません。
また、以下の指定文字を使用すると、自動的に数値に置き換えられます。
「%y」年4桁
「%m」月
「%d」日
「%h」時
「%i」分
「%s」秒
「%l」ミリ秒
「%Y」年(下2桁。2015年であれば15と出力されます)
「%M」月(2桁。1月であれば01と出力されます)
「%D」日(2桁)
「%H」時(2桁)
「%I」分(2桁)
「%S」秒(2桁)
「%L」ミリ秒(3桁)
「%n」連番値
「%%」文字の%
例
[%y%m%d]cap%n → [2015213]cap0001
[%Y%M%d]cap%n → [150213]cap0001
[%Y-%M-%d]cap%n → [15-02-13]cap0001
[%y%M%d_%H%I%S]cap%n → [20150213_010101]cap0001
拡張子はファイル形式で設定されたファイルの拡張子が自動的につきます。
連番値
画像が出力されるごとに+1されていく数値です。ファイル名%nにて使用することできます。
連番桁数
ファイル名で%nを使用したときに、連番値が設定した桁数になるよう調整されます。
4桁であれば1 → 0001、7桁であれば1 → 0000001 とファイル名に設定されるようになります。
■そのほか
このソフトウェアを使用し、何らかの障害が発生しても責任を取りかねますのでご了承ください。
zlibライブラリを使用しています。
Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler
http://www.winimage.com/zLibDll/
libpngライブラリを使用しています。
Copyright (c) 1998-2007 Glenn Randers-Pehrson
http://www.libpng.org/
■更新履歴
2020-12-17 ver 1.02b
最小化状態で終了したあと再び起動したときに、最小化状態で起動しないのを修正
2019-11-19 ver 1.02a
ウィンドウ生成周りが間違っていたのを修正
キーフックをスレッド処理に変更
2018-03-12 ver 1.02
キー別設定にカーソルを描画と出力先の設定を別個に設定できるように変更
2018-02-23 ver 1.01a
リソース書き直し
2017-09-11 ver 1.01
複数デスクトップを1枚の画像に保存できる機能を追加
2016-12-18 ver 1.00b
バルーンクリック時にファイル選択状態で出力先フォルダを開くよう修正
2015-02-15 ver 1.00a
終了確認メッセージウィンドウが出ているときにキャプチャすると強制終了していたのを修正
2015-02-14 ver 1.00
2020年7月23日木曜日
日記ちゃん
fkey122b.exe以下がセキュリティソフトに引っかかる問題。
Fスクリーンキーボードでは各アプリケーションの全角半角の状態を取得するのに、グローバルフックを使用しIMEの状態を取得してデータをプログラムに送り、半角全角状態を画面に表示している。
が、プログラムにデータを送るのにPostMessageしてるのがセキュリティソフトがトロイと認識してダメだするみたい。
以下はグローバルフック内で使用したコード。
他の全角半角の状態取得方法
Fスクリーンキーボードでは各アプリケーションの全角半角の状態を取得するのに、グローバルフックを使用しIMEの状態を取得してデータをプログラムに送り、半角全角状態を画面に表示している。
が、プログラムにデータを送るのにPostMessageしてるのがセキュリティソフトがトロイと認識してダメだするみたい。
以下はグローバルフック内で使用したコード。
DLLEXPORT LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam )
{
CWPRETSTRUCT* callWndProcRet = (CWPRETSTRUCT*)lParam;
if ( cg_hParentWnd &&
code == HC_ACTION &&
callWndProcRet->message == WM_IME_NOTIFY &&
(callWndProcRet->wParam == IMN_SETOPENSTATUS || callWndProcRet->wParam == IMN_OPENSTATUSWINDOW)
)
{
HIMC hImc = ImmGetContext( callWndProcRet->hwnd );
if ( hImc )
{
BOOL isIMEOpen = ImmGetOpenStatus( hImc );
ImmReleaseContext( callWndProcRet->hwnd, hImc );
if ( cg_isIMEOpen != isIMEOpen )
{
PostMessage( cg_hParentWnd, WM_ISOPEN_IME, (WPARAM)isIMEOpen, 0 );
cg_isIMEOpen = isIMEOpen;
}
}
}
return CallNextHookEx( cg_hHook, code, wParam, lParam );
}
他の全角半角の状態取得方法
HWND hImeWnd = ImmGetDefaultIMEWnd( hTargetWnd ); bool isImeOpen = SendMessage( hImeWnd, WM_IME_CONTROL, IMC_GETOPENSTATUS, 0 );
Fスクリーンキーボード ver1.22c

■ダウンロード
File: fkey122c.zip
Size: 282KB
分類: フリーソフト
■概要
スクリーンキーボードにフリック機能をつけて、ちょっとだけ入力を快適に。
従来のキーボードレイアウトに加えて、フリック入力用のレイアウトも用意。
■動作環境
Windows XP, 8
CPU 800MHz以上
メモリ 256MB以上
■アンインストール
レジストリは触っておりません。
削除の際はフォルダごとゴミ箱へ。
■使い方
・各キーを左クリックすることで、そのキーを押したことになります。
・フリック(クリックしたままカーソルを移動し、指を離す)することで
ShiftやCtrlキーを付加したり、関連したキーを押すことができます。
●レイアウトAB
レイアウトを2種類設定でき、必要に応じて切り替えて使用することができます。
◇キーボードレイアウト
クリック後右にフリックで、クリックしたキーにShiftキーが付加
クリック後上にフリックで、クリックしたキーにAltキーが付加
クリック後左にフリックで、クリックしたキーにCtrlキーが付加
クリック後下にフリックで、クリックしたキーにShiftとCtrlキーが付加
で統一しています。
◇フリックレイアウト
キーの上下左右に各文字が配置されています。
「っ」は「ゃ」の左フリックに配置してあります。
●右クリックから各フリック方向で以下の動作をします
フリックしない:キーボードレイアウトとフリックレイアウトの切り替えを行います。
左:色の変更
上:設定ウィンドウ表示
右:レイアウト変更
下:最小化
設定の「右クリックメニュー」タブで変更できます。
●設定ウィンドウ
設定ウィンドウを表示するには、
・タイトルバーダブルクリック
・右クリックから上フリック
・左上アイコンを右クリックで表示されるメニューから「設定ウィンドウを表示」
の方法で表示することができます。
「動作」タブ
■フリック開始距離
フリックしたと認識される距離(dot)を設定します。
■フリック角度
フリック角度をずらすことができます。真横へのマウス操作が苦手な方は少し数値を変えてみてください。
■キー押し時間
キーを押してから離すまでの時間を設定します。
キー入力に反応しない場合数値をあげると、反応するようになるかもしれません。
■レイアウト設定
キーボード、フリックそれぞれのレイアウトを設定します。
■サウンド設定
クリック時に音を鳴らすかを設定します
■最前面表示
オフにするとほかのウィンドウの下に表示されるようになります
■画面端にすいつく
画面端にウィンドウを移動した際、画面端にぴったりとウィンドウがくっつくよう補正します。
数値が大きいほど、くっつくまでの距離が長くなります。
■自動移動
ウィンドウが画面下か上の近いほうに自動で移動するようになります。
タブレット等で画面を回転した際、隙間が気になる人向け
■タイトルバーに自動移動ボタンを表示する
自動移動ボタンがタイトルバー上に表示されるようになります。
クリックで手軽に自動移動のオンオフを切り替えることができるようになります
■レイアウト変更時にウィンドウを画面内に収める
レイアウトを変更したときに、画面外にウィンドウが飛び出さないよう位置調整するようになります。
また画面サイズより大きい場合、画面内に収まるようサイズを調整します
■最小化したとき押されているキーを離す
[Shift][Ctrl][Alt][Win]キーはクリックでトグル状態になりますが、
この時に最小化すると自動でトグル状態を解除するようになります。
「表示タブ」
■フォント設定
フォントを設定します。また太字、斜体、アンチエイリアスを有効無効を選択できます。
■カラー設定
色合いを設定します
■背景透明度
背景部分の透明度を変更します
■キー透明度
キー部分の透明度を変更します
■透過色を正確に計算する
計算を挟み正しい色味が出るようにしますが、処理負担が増えます。
■カーソルがウィンドウ上にないとき全体を半透明に
スクリーンキーボードを使用していないときは邪魔にならないよう半透明にできます。
■カーソルがウィンドウフレーム上にない場合はフレームを描画しない
フレームが邪魔にならないよう、不要な時は描画しないようにできます
■ウィンドウフレームは常に描画しない
ウィンドウ移動はホイールクリックで可能です。
■背景画像を使用する
dataフォルダ内のbackground.bmpを背景に使用するようになります。
この画像ファイルを好きな画像に差し替えることで、お好きな画像を背景として表示できます
■画面更新間隔
数値が小さいほど見た目上の反応速度が向上しますが、処理負担も増えます。
■キーの上ではカーソルの形状を変更する
マウスカーソルの見た目を変えます。
「右クリックメニュー」
右クリック時に出てくるフリックの項目を変更できます
■そのほか
このソフトウェアを使用し、何らかの障害が発生しても責任を取りかねますのでご了承ください。
■更新履歴
2020-07-23 ver2.22c
グローバルフックによる全角半角チェック機能を削除
2020-03-27
最小化を解除したときに全角半角をチェックするよう修正
2020-02-18 ver 1.22b
別の全角半角モードの取得方法を実装
2018-06-05 ver 1.22a
configファイルが実行ファイルと同フォルダになるよう修正
2018-05-11 ver 1.22
設定で右クリックのフリックを変更可能に
キーボードレイアウトとフリックレイアウトを統合し、任意のレイアウト二つを切り替えて使用するように変更
色を追加
2015-11-15 ver 1.21a
10キーレイアウト追加して再圧縮。プログラムに変更なし
2015-05-27
クリック位置検出をメッセージ来た段階の場所に変更、pointClickで正常動作するように。
2014-09-18 ver1.21
フリック上に+Altを追加
フォントサイズ計算を最適化
2014-04-28 ver1.20
コンフィグウィンドウ表示中は最前面表示をオフにするよう修正
2014-04-23
最小化したとき押されているキーを離す機能を追加
各レイアウトの上下左右の余白を2dot小さく
2014-04-20
最前面表示オンオフ切り替え可能に
画面端にすいつく機能追加
レイアウト変更時にウィンドウを画面内に収める機能追加
ウィンドウ自動移動機能追加。
またタイトルバーに自動移動ボタンを表示可能に
キー透明度変更可能に
コンフィグウィンドウのUI変更
背景半透明率のデフォルト値を50%から25%に変更
フォントのサイズ計算を高速化
レイアウト変更時に表示を即座に行うよう修正
コンフィグウィンドウを閉じたときに、表示反映を即座に行うよう修正
2014-03-07
フリックレイアウトのctrlを左ctrlに変更
2014-01-07
"0"キーの[+Shift]表記がおかしかったのを修正。
2014-01-02 ver 1.11
右クリックからシステム用のフリック表示をするように変更
capslock時に数字、記号キーの[+Shift]表示がおかしかったのを修正
背景透明度を変更しても反映されない場合があるのを修正
2013-12-23
ウィンドウサイズ変更時の文字サイズ計算を少し最適化
2013-12-21
常にウィンドウフレームの透明化を可能に
フリック方向に文字表示を追加
2013-12-12
自分ウィンドウがアクティブになった時にほかウィンドウをアクティブ化するのを600ms時間を置くよう修正。
タスクバー上をダブルクリックした際に最小化されない問題の解決のため。
8方向フリックのレイアウトを追加
フリックレイアウトの配置を一部修正変更
英数字フリックを追加
フリック角度を変更可能に
2013-10-29 ver 1.10a
半角全角の切り替わりで再描画してなかったのを修正
キーデータ読み込みをやや最適化
2013-10-07 ver 1.1
半透明描画を可能に
フリック部分を別ウィンドウに
各キーを画像から文字描画に変更
色を複数から選択可能に
キー描画を最適化し必要最小限に
Shiftキー押した状態で[+Shift]フリックした場合、Shiftキーがキャンセルされるよう修正。
ただし[+ctrl],[+shift,+ctrl]は押されているShift,ctrlキーをキャンセルしない
2013-08-17 ver 1.02
描画頻度を選択可能に。いままでデフォルトでは100ms間隔だったのを30ms間隔に変更。
効果音の音量を50%に下げた。
背景画像の変更
2013-04-04 ver 1.01
拡大縮小表示を高画質モードに変更
アクティブの時にクリックした場合に入力を取り消していたのを受け付けるよう修正
レイアウト選択可能に
ミニキーボード、フルキーボード、フリック+テンキーレイアウトを作成
2013-03-15 ver 1.00c
多重起動できないよう修正
keyhook.dllのエラー処理を最適化
フリック開始距離の設定値が反映されていなかったのを修正
2013-03-09 ver 1.00b
最小化された状態で終了すると、次回起動時にウインドウが見えない位置に表示されてしまうのを修正
2013-03-06 ver 1.00a
現在のレイアウト選択情報が保存されないのを修正。
フリックレイアウト内のコピーキー右ペーストが間違ったショートカットだったのを修正
設定ウインドウ内にバージョン情報を表示するよう修正
2013-03-02 ver 1.0
登録:
投稿 (Atom)



