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

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

とうとう来た

待ちに待ったKinect for Windows SDK Betaがようやく登場。
StillDesign.PhysX.NetもPhysx3.0の対応がボチボチと進んでいるようで、
この二つで何かおもちゃ作りたいなぁ・・


しかしながら、KinectにはWindows7しばりがあって、しかも両方共XNAは4.0のみ・・・
C#のAndroidアプリ開発環境MonodroidもVS2010のプラグインだったし、
WinXP+VS2008はもう潮時をとうに超えたんだなぁという実感が湧いてきた。


Win7マシンはもう既にあるから、あとはVS2010か・・・
バージョンアップかぁ・・・高いんだよなぁ(´・ω・)
このエントリーをはてなブックマークに追加
LINEで送る

事の顛末

今回騒ぎに騒いだRadeon問題にようやく決着。

まず結論から言うと、シェーダーのバージョンを変えるとだめになる問題は
Spritebatchで使うエフェクトのコンパイラの指定が、
ピクセルシェーダーにしか適応できないことに起因しているように思う。

というのもコンパイラで3.0のシェーダーを利用するためには
ピクセル、バーテックスシェーダーの両方のバージョンを3.0に揃える必要がある。

これに違反するため、Radeonでは素直にバグとして発症し、
Geforceではドライバにより補正されたという事のようだ。


あと、ポリゴンが伸びる問題があるんだけど、
これはソフトとかいう以前の問題だったっぽくて、
公式のテクスチャスキニングのサンプルでも同様の結果を得た。
(これはちゃんと最新版のXNA4.0で検証した結果)

そういえばFFをやってる時も時折チラツキがあったが、これが原因だったように思う。



SSでは、かかとやつま先が少々伸びている程度だが、
ひどいときは画面いっぱいにポリゴンが伸びることもある。

○飽くまで傾向として
・何故か伸びるのは足元が多い(腕が伸びることもあるがまれにしかない)
・伸びるアニメーションがだいたい一緒
・だいたい2,3ループに一回発症する
・一回伸びると何フレームか連鎖してダメな事が稀にある


たぶん、他のPCゲームやってる所とかでドライバ設定のノウハウありそうなので、
解決法はそっちを当たってみる事にする。

とりあえず、ソフト的にはバグではないと考えてよさそうなので、
この件はこれにてクローズとしたい。


=6/16追記=
ドライバの設定についてはこの現象の解消方法として
BIOSでAdvancedタブ→JumperFree Configurationを選択
PCIE Spread SpectrumをAuto→Disbledに変更といったノウハウがあったが、
自分のマザーボードではこの設定ができなんだ(´・ω・)

さて、どうしたものか・・・
このエントリーをはてなブックマークに追加
LINEで送る

誰か教えてOTL

大ハマリしていたRadeon問題にまた新たな展開が。

自分の理解ではHLSLは完全な下位互換があるのだと思っていた。

だから一つのプログラム内のHLSLによって
バージョンががたがたなのは望ましくないものだと考えた私は
コンパイラの指定を全て3.0に書き換えたのだ。


これを
PixelShader = compile ps_2_0 PixelShader();
こんな感じ
PixelShader = compile ps_3_0 PixelShader();


たったこれだけで、Radeonで描画に失敗するようになる。
つまりXNAでは画面が紫色のままになる。

HLSL内部を詳細にステップ実行したわけではないが、
どうも描画済みレンダーターゲットのテクスチャを取得できず、
その後の処理に失敗してるっぽい。


ハード依存なので人によっては再現しないかもしれないが
公式のブルームサンプルでもシェーダーのバージョンを
全て3.0に変えたところ同様の問題が確認できた。

ちなみに2.0指定では問題なく動作する。


コンパイラが別物になるから、吐き出されるバイナリが変わるなんてのは
頭じゃ理解できるが、動作しなくなる仕組みが解らない・・

なんのなさコレ。
ダレか内部仕様に詳しい偉い人、教えて・・・OTL
このエントリーをはてなブックマークに追加
LINEで送る

土下座もの

前回の問題解決法でサラリと
「対処法は公式のブルームサンプルにある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で送る

 | HOME | 

PAGE TOP ▲

Appendix

■春条

■春条

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

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

Search

Calender

« | 2011-06 | »
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

利用規約