C#は電気羊の夢を見るか?(引っ越し中)

dtiブログが閉鎖とのことでhttp://tanocs.blog.fc2.com/へ引っ越します。

GPUを使って計算した結果をCPUに戻す[ちょっと便利で速い版]

二日前の記事のHLSLのみ書き換えた版

これで前回255回が上限だったループが4095回まで拡張できた。
ただ、もしかするとグラボによっては動かない可能性もあるので注意が必要。


このソースの検証時にようやく気がついたのだが、
GPUさんは浮動小数点の誤差に結構弱いことを思い出した。
0.1fを512個とか加算してくと顕著に現れてくる。

この辺はゲームだったら、
このぐらいの誤差はそれほど気にならないから的な理由だったと思う。

利用目的次第だが、誤差が気になる場合は計算する前の値に*10とか*100とかしてやり
0.1fとか苦手な小数を1.0fなどの整数にかえて計算してやってから/10してやると誤差はなくなる。

*10とか*100とかの下駄のはかせ具合は利用する際の目的や予想される数値次第なので、
使う人それぞれでご対応くだされ。


■HLSL

float InputWidth;
float4 result;

texture SceneTexture;
sampler SceneSampler : register(s0) = sampler_state
{
Texture = (SceneTexture);
};

float4 PixelShaderFunction(float2 texCoord : TEXCOORD0) : COLOR0
{
InputWidth %= 4096;
int i;
int j;
int Loop1 = InputWidth / 64;
Loop1 %= 64;
result = 0;

for (j = 0; j < Loop1; j++) {
for (i = 0; i < 64; i++) {
result += tex2D(SceneSampler, texCoord + float2(1.0f / InputWidth * (j * 64 + i), 0)) * 100.0f;
}
}

for (j = 0; j < InputWidth % 64; j++){
result += tex2D(SceneSampler, texCoord + float2(1.0f / InputWidth * (Loop1 * 64 + j), 0)) * 100.0f;
}

return result / 100.0f;
}

technique CulculateTechnique
{
pass Pass1
{
PixelShader = compile ps_3_0 PixelShaderFunction();
}
}
このエントリーをはてなブックマークに追加
LINEで送る

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://t01a.dtiblog.com/tb.php/105-3672bb87

« GPUを使って計算した結果をCPUに戻す[便利で遅い版]  | HOME |  お蔵入り »

PAGE TOP ▲

Appendix

■春条

■春条

生息地は愛知
車と甘い物が好きな31歳
特技は無限昼寝

MONOからSharpDXを使う
変態的な手法で、
.NET Frameworkを使わずに
ゲーム作りやってます。

Search

Calender

« | 2018-11 | »
S M T W T F S
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

Twitter

Recent Entries

DTIブログポータルへ
このブログを通報
Report Abuse

利用規約