3

私は小さなゲームを開発していて、繰り返しのテクスチャでフィールドグラウンド(土地)を描きます。私の問題はレンダリングされた結果です。これにより、立方体の周りのすべてが明るい影のように見えるように見えます。描画機能で光を標準化したり、影の効果を取り除いたりすることはできますか?

私の悪い英語でごめんなさい。

これが私の問題をよりよく理解するためのスクリーンショットです。 ここに画像の説明を入力してください

ここに私のコード描画関数(vertexbufferを使用したモデルのインスタンス化)

    // Draw Function (instancing model - vertexbuffer)
    public void DrawModelHardwareInstancing(Model model,Texture2D texture, Matrix[] modelBones,
                                     Matrix[] instances, Matrix view, Matrix projection)
    {
        if (instances.Length == 0)
            return;

        // If we have more instances than room in our vertex buffer, grow it to the neccessary size.
        if ((instanceVertexBuffer == null) ||
            (instances.Length > instanceVertexBuffer.VertexCount))
        {
            if (instanceVertexBuffer != null)
                instanceVertexBuffer.Dispose();

            instanceVertexBuffer = new DynamicVertexBuffer(Game.GraphicsDevice, instanceVertexDeclaration,
                                                           instances.Length, BufferUsage.WriteOnly);
        }

        // Transfer the latest instance transform matrices into the instanceVertexBuffer.
        instanceVertexBuffer.SetData(instances, 0, instances.Length, SetDataOptions.Discard);

        foreach (ModelMesh mesh in model.Meshes)
        {
            foreach (ModelMeshPart meshPart in mesh.MeshParts)
            {
                // Tell the GPU to read from both the model vertex buffer plus our instanceVertexBuffer.
                Game.GraphicsDevice.SetVertexBuffers(
                    new VertexBufferBinding(meshPart.VertexBuffer, meshPart.VertexOffset, 0),
                    new VertexBufferBinding(instanceVertexBuffer, 0, 1)
                );

                Game.GraphicsDevice.Indices = meshPart.IndexBuffer;


                // Set up the instance rendering effect.
                Effect effect = meshPart.Effect;
                //effect.CurrentTechnique = effect.Techniques["HardwareInstancing"];
                effect.Parameters["World"].SetValue(modelBones[mesh.ParentBone.Index]);
                effect.Parameters["View"].SetValue(view);
                effect.Parameters["Projection"].SetValue(projection);
                effect.Parameters["Texture"].SetValue(texture);


                // Draw all the instance copies in a single call.
                foreach (EffectPass pass in effect.CurrentTechnique.Passes)
                {
                    pass.Apply();

                    Game.GraphicsDevice.DrawInstancedPrimitives(PrimitiveType.TriangleList, 0, 0,
                                                           meshPart.NumVertices, meshPart.StartIndex,
                                                           meshPart.PrimitiveCount, instances.Length);
                }
            }



        }
    }
    // ### END FUNCTION DrawModelHardwareInstancing
4

2 に答える 2

4

問題は、使用している立方体メッシュです。法線は平均化されていますが、立方体の面に直交するようにしたいと思います。

8つの頂点ではなく、合計24の頂点(各側に4つ)を使用する必要があります。各コーナーには、隣接する面ごとに1つずつ、同じ位置で法線が異なる3つの頂点があります。

2つの立方体、1つは共有法線、もう1つは正しい法線

法線を正しくエクスポートするようにFBXエクスポータを設定できない場合は、独自のキューブメッシュを作成するだけです。

var vertices = new VertexPositionNormalTexture[24];

// Initialize the vertices, set position and texture coordinates
// ...

// Set normals

// front face
vertices[0].Normal = new Vector3(1, 0, 0);
vertices[1].Normal = new Vector3(1, 0, 0);
vertices[2].Normal = new Vector3(1, 0, 0);
vertices[3].Normal = new Vector3(1, 0, 0);

// back face
vertices[4].Normal = new Vector3(-1, 0, 0);
vertices[5].Normal = new Vector3(-1, 0, 0);
vertices[6].Normal = new Vector3(-1, 0, 0);
vertices[7].Normal = new Vector3(-1, 0, 0);

// ...
于 2013-02-26T21:15:14.020 に答える
1

不適切に計算された/法線がないようです。 この例、特にパート3を見てください。

法線は、光が頂点/ポリに直交して照らされた場合にその頂点/ポリで反射する方向を表すベクトルです。

この写真が示すのが好きです。青い線は、曲線上の特定の各ポイントでの法線方向です。

XNAでは、次のように頂点vert1、vert2、およびvert3を持つポリゴンの法線を計算できます。

Vector3 dir = Vector3.Cross(vert2 - vert1, vert3 - vert1);
Vector3 norm = Vector3.Normalize(dir);

多くの場合、これはモデリングソフトウェアによって自動的に行われるため、計算は不要です。ただし、コードでキューブを作成する場合は、おそらくその計算を実行する必要があります。

于 2013-02-26T21:11:04.717 に答える