1

SharpDX d3d9 を使用して、照明効果のある球体を作成しています。

だから、私は以下のコードを試しました。

 var direct3D = new Direct3D();
 var device = new SharpDX.Direct3D9.Device(direct3D, 0, SharpDX.Direct3D9.DeviceType.Hardware, this.Handle, CreateFlags.HardwareVertexProcessing,
 new PresentParameters(this.ClientSize.Width, this.ClientSize.Height));
 Light light = new Light();
 light.Type = LightType.Point;

 light.Diffuse.Red = 1.0f;
 light.Diffuse.Green = 1.0f;
 light.Diffuse.Blue = 1.0f;
 light.Diffuse.Alpha = 0.7f;

 light.Position = new Vector3(-10, -10, -10);

 light.Range = 200.0f;
 light.Attenuation0 = 0.1f;

 device.SetRenderState(RenderState.Lighting, true);
 device.SetRenderState(RenderState.Ambient, new Color4(0.5f, 0.5f, 0.5f, 0.5f).ToRgba());

 device.SetLight(0, ref light);
 device.EnableLight(0, true);

 Material met = new Material();
 met.Diffuse = new Color4(1, 1, 1, 1);
 met.Ambient = new Color4(1, 1, 1, 1);
 met.Specular = new Color4(1, 1, 0, 1);
 met.Emissive = new Color4(0, 0, 0, 1);
 met.Diffuse.Alpha = 0.7f;
 met.Power = 5.0f;

 device.Material = met;

しかし、何も変わっていません。

img : http://cfile24.uf.tistory.com/image/156A994C5103547E273035

(色は入力値です。)

レンダリングコードは

 RenderLoop.Run(this, () => {
            var time = clock.ElapsedMilliseconds / 1000.0f;

            device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0);
            device.BeginScene();

            effect.Technique = technique;
            effect.Begin();
            effect.BeginPass(0);

            var worldViewProj = Matrix.RotationX(time) * Matrix.RotationY(time * 2) * Matrix.RotationZ(time * .7f) * viewProj;
            effect.SetValue("worldViewProj", worldViewProj);
            //effect.SetValue("worldViewProj", viewProj);

            //device.DrawPrimitives(PrimitiveType.LineList, 0, counts / 2);
            device.DrawPrimitives(PrimitiveType.TriangleList, 0, counts / 3);

            effect.EndPass();
            effect.End();

            device.EndScene();
            device.Present();
        });

アプリケーションにライトを適用するにはどうすればよいですか?

と、

var effect = Effect.FromFile(device, "MiniCube.fx", ShaderFlags.None);

それは何の用量を意味しますか?私は何の効果も望んでいません..(SharpDXサンプルソースが付属しています.MiniCube.csproj)

4

2 に答える 2

1

C# の DX ラッパーであることを除けば、SharpDX には詳しくありません。クールなコンセプトですが、DirectX の仕組みに慣れていない場合は使用しないように警告します。私が理解している限りでは、DirectX 自体には膨大な量の例とドキュメントが既にあるという事実のために、SharpDX 関係者は意図的にほとんどドキュメントを提供していません。

エフェクトに触れると、それらはシェーダー ロジックを処理するオブジェクトです。シェーダーは、GPU と直接やり取りする「ミニプログラム」です。現代のゲームのほとんどすべては、照明を含め、シェーダーを介して記述、表示、歪曲、モーフィング、変更、さらには移動さえされています! HLSL (または高レベル シェーダー言語) は、DirectX インターフェイスの標準言語です。皮肉なことに、単純なシェーダーのチュートリアルや例を見つけるのはかなり難しい場合がありますが、より複雑な詳細はかなりうまくマップされています。

これらは差し迫ったニーズに特に役立つものではないかもしれませんが、HLSL の資料に関する私のお気に入りのリソースを 2 つ紹介します。

DirectXTutorial.com

ジャジドゥー

DXTutorial は、Microsoft が最近非推奨 (ろくでなし) と宣言した D3DX ライブラリを除いて、事実上依存関係なしで C++ を介して DX を学習するのに驚くべきものです。また、プレミアム コンテンツには名目上 50 ドルの料金がかかります (シェーダーが含まれていると思います)。

JaJDoo のチュートリアルはそれ自体が優れていますが、Ogre グラフィックス フレームワークを対象としているため、Ogre はカスタム シェーダー パイプラインを使用してテクニックとパスを定義および呼び出す方法を変更するため、コードを変更する必要があります。 IMOを理解するために取り引きします。

そうは言っても、私は実際にあなたの質問に答えていないことに気づきました。ただし、SharpDX から離れて基本を学ぶことをお勧めします。私の意見に同意しない人もいるかもしれませんが、私には少し後ろ向きに思えます。とにかく頑張ってください!

于 2013-02-05T18:25:08.203 に答える