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

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

土下座もの

前回の問題解決法でサラリと
「対処法は公式のブルームサンプルにあるDrawFullScreenQuadで代用が効くので、
こちらに移行することを強くオススメする。」
等とのたもうたが、よくよくみると、海外の別のサンプルでした。

そんな訳で、その海外のサンプルも良く良く見るとイマイチだったので書きなおした。
お詫び的な意味になるかどうか分からないけど、それを公開したいとおもいます。


公式のブルームサンプルみて「これもスプライトバッチじゃねーかボケ!」と思った方は
こちらをご使用ください。

すんませんでした _○/|_

例によってXNA3.1です。悪しからず。

using System;

using System.Collections.Generic;
using System.Text;

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

public class FullScreenQuad
{
//vertexBuffer.SetData用の構造体
private struct QuadVertex
{
public Vector3 position;
public Vector3 texCoordAndCornerIndex;
}

GraphicsDevice GraphicsDevice;

VertexBuffer vertexBuffer;
VertexDeclaration vertexDeclaration;

public FullScreenQuad(GraphicsDevice graphicsDevice) {
this.GraphicsDevice = graphicsDevice;
CreateVertexDeclaration();
CreateFullScreenQuad();
}

private void CreateVertexDeclaration() {
VertexElement[] declElements = new VertexElement[2];

declElements[0].Offset = 0;
declElements[0].Stream = 0;
declElements[0].UsageIndex = 0;
declElements[0].VertexElementFormat = VertexElementFormat.Vector3;
declElements[0].VertexElementMethod = VertexElementMethod.Default;
declElements[0].VertexElementUsage = VertexElementUsage.Position;

declElements[1].Offset = sizeof(float) * 3;
declElements[1].Stream = 0;
declElements[1].UsageIndex = 0;
declElements[1].VertexElementFormat = VertexElementFormat.Vector3;
declElements[1].VertexElementMethod = VertexElementMethod.Default;
declElements[1].VertexElementUsage = VertexElementUsage.TextureCoordinate;

vertexDeclaration = new VertexDeclaration(this.GraphicsDevice, declElements);
}

private void CreateFullScreenQuad() {
vertexBuffer = new VertexBuffer(this.GraphicsDevice, typeof(QuadVertex), vertexDeclaration.GetVertexStrideSize(0) * 4, BufferUsage.None);
QuadVertex[] vbData = new QuadVertex[4];

// 右上
vbData[0].position = new Vector3(1, 1, 1);
vbData[0].texCoordAndCornerIndex = new Vector3(1, 0, 1);

// 右下
vbData[1].position = new Vector3(1, -1, 1);
vbData[1].texCoordAndCornerIndex = new Vector3(1, 1, 2);

// 左上
vbData[2].position = new Vector3(-1, 1, 1);
vbData[2].texCoordAndCornerIndex = new Vector3(0, 0, 0);

// 左下
vbData[3].position = new Vector3(-1, -1, 1);
vbData[3].texCoordAndCornerIndex = new Vector3(0, 1, 3);


vertexBuffer.SetData(vbData);
}

public void Draw(Texture2D texture) {
GraphicsDevice.VertexDeclaration = vertexDeclaration;
GraphicsDevice.Vertices[0].SetSource(vertexBuffer, 0, vertexDeclaration.GetVertexStrideSize(0));

GraphicsDevice.Textures[0] = texture;
GraphicsDevice.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2);

GraphicsDevice.VertexDeclaration = null;
GraphicsDevice.Vertices[0].SetSource(null, 0, 0);
}

}
このエントリーをはてなブックマークに追加
LINEで送る

コメント

コメントの投稿

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

トラックバック

http://t01a.dtiblog.com/tb.php/129-4cb10ecf

« Radeonの問題点  | HOME |  誰か教えてOTL »

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

利用規約