スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

レンダーステート

今日はレンダーステートについてまとめておくよ!


RenderState.CullMode
背面の三角形をカリングする方法を指定する

RenderState.DepthBufferEnable
深度バッファリングがONかOFFか
SpriteBatch.Beginによってどの設定でもfalseに設定されるので描き終わったら変更しないと3D描写がおかしくなることが!

RenderState.AlphaBlendEnable
アルファ ブレンディングによる透明化をONにするかOFFにするか

RenderState.SourceBlend
何で色抜きをするか?Blend.SourceAlphaにするとAの値になる

RenderState.AlphaTestEnable
ピクセル単位のアルファ テストを可能にするレンダリング ステートフラグ
テストにパスした場合は、ピクセルはフレーム バッファーによって処理されます。
それ以外の場合には、ピクセルのフレーム バッファー処理がすべてスキップされます。

RenderState.AlphaFunction
アルファ テストのための比較関数を取得または設定します。
デフォルトは CompareFunction.Always で常に成功。
新しいピクセル値と現在のピクセル値の関係でピクセル値の採用方法を変えたい時に使う。

RenderState.ReferenceAlpha
アルファ テストが有効時、ピクセルをテストするための基準となるアルファ値です。
既定値は 0 値は 0x00000000 から 0x000000FFで指定。
この値が具体的に何を表すかはAlphaFunctionによって変化する。

RenderState.AlphaBlendOperation
アルファの計算方法。加算とかそういうやつ。

RenderState.SourceBlend //デバイスのステンシル バッファー能力を表すBlend 係数。
RenderState.DestinationBlend //デスティネーション ピクセルを設定または取得する Blend 係数。
できあがる色 = 抜きたい色*SourceBlend + 背景色*DestinationBlend
ってなイメージ
 
RenderState.SeparateAlphaBlendEnabled
アルファ チャネルに対する個別のブレンディングフラグ
false に設定した場合、アルファに対して適用される、レンダリング ターゲットのブレンディング係数およびブレンディング処理は、カラーに対して定義されているものと同じになります。
SupportsSeparateAlphaBlend が true に設定されない実装では、このモードは効果的に false がハードコードされています。
正直なんのこっちゃいな。



以上!

ねよっと。
スポンサーサイト

C#。要素を消す!

foreachでListとかの要素を消せたらな~なんてプログラマなら誰しも一回は考えるはず!

forでだらだら消せばいいんだろうけどC#らしくないといえばらしくない。
そもそもインクリメントでは要素番号がずれるのもわかりにくいしね。

そんなときのお助けメソッド。RemoveAll。

List o = new List();//適当なリストを用意

RemoveAll(delegate(Hoge item) {return item == ~;});//これだけで消せる


条件になっているところが item == ~ の部分で一致していたら消される

もう少し複雑な場合は別途staticなbool型の関数を書いてRemoveAll()の中に関数を放り込めばOK。
引数としてHogeを受け取れるようにしてあげてね。一個づつ飛んでくるしデバッグもできる。


ねよっと。

頂点バッファとか。

3Dやってる人なら基本なんだろうけどきっちりまとめて描いてなかったので載せておくことにする。

シェーダは以前やったような気がするのでその手前までの流れを書くね。
普通は頂点バッファの仕様は標準で用意してあるものを使うんだろうけど、ネット上にいいサンプルが沢山あるのでそっちを見てください。
今回はシェーダに送り出すデータからしっかり作成していきます。

////////////// 頂点バッファの仕様を決める //////////////
public struct MyVertex
{
public Vector2 Position;
public Vector2 UV;
public MyVertex(Vector2 position, Vector2 uv)
{
Position = position;
UV = uv;
}
}
//C#の構造体はメモリの順番は保持されるそうなので安心。


////////////// 頂点バッファの作成 //////////////
const int numVertices = 4;
vb = new VertexBuffer(
graphics.GraphicsDevice, //この頂点バッファーに関連付けるグラフィック デバイス。
typeof(MyVertex),//この頂点バッファーの頂点の型。
numVertices,//この頂点バッファーの要素の数。
ResourceUsage.None,//この頂点バッファー リソースの動作を特定するオプション。
ResourceManagementMode.Automatic);//?
//↑今のバージョン(3.0)だと最後の二個が変わってるから注意。

MyVertex[] vertices = new MyVertex[numVertices]
{
new MyVertex(
new Vector2(-1.0f, 1.0f), new Vector2(0.0f, 1.0f) ), // 左上
new MyVertex(
new Vector2( 1.0f, 1.0f), new Vector2(1.0f, 1.0f) ), // 右上
new MyVertex(
new Vector2( 1.0f, -1.0f), new Vector2(1.0f, 0.0f) ), // 右下
new MyVertex(
new Vector2(-1.0f, -1.0f), new Vector2(0.0f, 0.0f) ), // 左下
};
vb.SetData(vertices);



////////////// 頂点ストリームへ //////////////
int vertexStride;
//VertexBuffer.SetDataによってコピーした内容は、マネージヒープ中での値型配列レイアウトと同じになるためsizeof演算子を用いておけばいい
unsafe { vertexStride = sizeof(MyVertex); }
// Vertices[0]は0番目の頂点ストリームに対応
graphics.GraphicsDevice.Vertices[0].SetSource(vb, 0, vertexStride);



////////////// ストリームとシェーダの対応表を作成 //////////////

vertexDecl = new VertexDeclaration(
graphics.GraphicsDevice, new VertexElement[] {
new VertexElement(
0, 0, VertexElementFormat.Vector2,
VertexElementMethod.Default,
VertexElementUsage.Position, 0),//シェーダででてくるPosition0とかいうのはこれね。
new VertexElement(
0, 8, VertexElementFormat.Vector2,
VertexElementMethod.Default,
VertexElementUsage.TextureCoordinate, 0),
});


VertexElementの内容は以下

VertexElement(
  ストリーム番号,
要素先頭からのバイト・オフセット,
データ型,
  テッセレーション属性,
  用途,
同一用途の区別用ID)



これでとりあえず書き出す前の処理は整ったことになる。
あとはよく見るサンプルのようにセットして書き出す処理を記述してやればよいことになる。

本とかではいきなり3Dプリミティブを写すサンプルが載っていたりするけど、自分としては

CPUとGPUの仕組みを理解する

超簡単なシェーダを作成してスクリーン上に2Dの線を引く

2Dで図形を書く

3D画像は情報を2D情報に押しつぶして描写しているだけだと説明する

3Dを2Dで表現する方法を説明する(仕組みではなく関数の使い方)

3Dプリミティブの表示


としなければいけないと思う。
勘で気付け!ってことなのかもしれないけれど。バカだったらどうすんのさ!!(俺みたいに)



ねよっと。

ただのメモ

ただのメモ


ASCII制御文字の入力方法
コード 10進 16進 入力
NUL 0 00 Ctrl+Space or Ctrl+@(*)
SOH 1 01 Ctrl+A
STX 2 02 Ctrl+B
ETX 3 03 Ctrl+C
EOT 4 04 Ctrl+D
ENQ 5 05 Ctrl+E
ACK 6 06 Ctrl+F
BEL 7 07 Ctrl+G
BS 8 08 Ctrl+H or Backspace
HT 9 09 Ctrl+I or Tab
LF 10 0A Ctrl+J(**)
VT 11 0B Ctrl+K
FF 12 0C Ctrl+L
CR 13 0D Ctrl+M(**)
SO 14 0E Ctrl+N
SI 15 0F Ctrl+O
DLE 16 10 Ctrl+P
DC1 17 11 Ctrl+Q
DC2 18 12 Ctrl+R
DC3 19 13 Ctrl+S
DC4 20 14 Ctrl+T
NAK 21 15 Ctrl+U
SYN 22 16 Ctrl+V
ETB 23 17 Ctrl+W
CAN 24 18 Ctrl+X
EM 25 19 Ctrl+Y
SUB 26 1A Ctrl+Z
ESC 27 1B Ctrl+[ or Escape(*)
FS 28 1C Ctrl+\(*)
GS 29 1D Ctrl+](*)
RS 30 1E Ctrl+^(*)
US 31 1F Ctrl+_(*)
DEL 127 7F Delete



ねよっと。

手助けソフトColorConverter

また無駄なソフトを作ってしまった。
製作時間4時間。

以下のようなことを行いたかった。
アンビエントオクルージョンの焼きつけテクスチャ

普通のモデルに貼り付けたテクスチャ

二枚を使ってテクスチャを作成したい。

フォトショでできそうなんだけど
影になってる部分だけ細かく彩度を変えたい
とか
影の部分をランバート計算によってやわらかくしてから付け加えたい
とか
結構わがまま言い出すと細かい処理ができない。

そもそもどのソフトも1枚の絵を演算で変えるという考えが根本にあるので目的のことがしにくい。

mudaa.jpg

この映像だと元の絵が同じなので、フォトショで出来る処理。彩度変えてるだけ。


ソフトを作るにあたって調べたことを載せておこっと。

*******
RGB系をYxy系へ
X=2.7689R+1.7517G+1.1302B
Y=R+4.5907G+0.0601B
Z=0.0565G+5.5943B


シェーダで使われる一般的な彩度 = 0.2989*R + 0.5866*G + 0.1145*B

*******

すくなっ(笑)

昔作った画像ソフトは重かったので新たにbitmap.LockBitsを使ってみた。
これははやい!いい感じだ。


ねよっと。
プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。