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

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

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

とりあえずで完成した物を配置


これなら簡単にforが上限なしで使える!しかもPS2.0で良い!
と思ったものの、この実装だとあまりGPUを活用出来ていない気がする・・・


次回は高速な処理のままforの上限をもう少し伸ばしたバージョンを作成予定


■メインソース

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;

namespace WindowsGame1 {
public class Game1 : Microsoft.Xna.Framework.Game {
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;

Texture2D inputTexture;
Texture2D initTexture;
RenderTarget2D result;
Effect additionCalculator;

float[] culcurate;
float[] resultBuffer = new float[1];

public Game1() {
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}

protected override void Initialize() {
culcurate = new float[] { 1.0f, 0.1f, 0.2f, 0.3f };
base.Initialize();
}

protected override void LoadContent() {
spriteBatch = new SpriteBatch(this.GraphicsDevice);

inputTexture = new Texture2D(GraphicsDevice, culcurate.Length, 1, 0, TextureUsage.None, SurfaceFormat.Single);
inputTexture.SetData(culcurate);

initTexture = new Texture2D(GraphicsDevice, 1, 1, 0, TextureUsage.None, SurfaceFormat.Single);
initTexture.SetData(new float[]{0.0f});

result = new RenderTarget2D(GraphicsDevice, 1, 1, 0, SurfaceFormat.Single);


additionCalculator = Content.Load("AdditionCalculator");
}

protected override void UnloadContent() {
inputTexture.Dispose();
result.Dispose();
}

protected override void Update(GameTime gameTime) {
Window.Title = resultBuffer[0].ToString();
base.Update(gameTime);
}

protected override void Draw(GameTime gameTime) {
GraphicsDevice.SetRenderTarget(0, result);
spriteBatch.Begin(SpriteBlendMode.None, SpriteSortMode.Immediate, SaveStateMode.None);
spriteBatch.Draw(initTexture, Vector2.Zero, Color.White);
spriteBatch.End();

additionCalculator.CurrentTechnique = additionCalculator.Techniques["CulculateTechnique"];

for (int i = 0; i < culcurate.Length; i++){
GraphicsDevice.SetRenderTarget(0, null);
additionCalculator.Parameters["SrcMap"].SetValue(result.GetTexture());
additionCalculator.Parameters["InputWidth"].SetValue(1.0f / culcurate.Length * i);

GraphicsDevice.SetRenderTarget(0, result);

spriteBatch.Begin(SpriteBlendMode.None, SpriteSortMode.Immediate, SaveStateMode.None);
additionCalculator.Begin();
additionCalculator.CurrentTechnique.Passes[0].Begin();

spriteBatch.Draw(inputTexture, Vector2.Zero, Color.White);

additionCalculator.CurrentTechnique.Passes[0].End();
additionCalculator.End();
spriteBatch.End();
}

GraphicsDevice.SetRenderTarget(0, null);

result.GetTexture().GetData(resultBuffer);

base.Draw(gameTime);
}
}
}


■HLSL

float InputWidth;

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

texture SrcMap;
sampler SrcSamp = sampler_state
{
Texture = ;
};

float4 PixelShaderFunction(float2 texCoord : TEXCOORD0) : COLOR0
{
return tex2D(SrcSamp, float2(0.5f, 0.5f)) + tex2D(SceneSampler, texCoord + float2(InputWidth, 0));
}

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

コメント

コメントの投稿

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

トラックバック

http://t01a.dtiblog.com/tb.php/104-40d272e9

« GPUを使って計算した結果をCPUに戻す[かってに改蔵]  | HOME |  GPUを使って計算した結果をCPUに戻す[ちょっと便利で速い版] »

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

利用規約