C# XNA皮肤模型Cel着色呈现全黑

C# XNA皮肤模型Cel着色呈现全黑,c#,xna,shader,models,xna-4.0,C#,Xna,Shader,Models,Xna 4.0,我实际上是在利用我在Apphub上找到的其他人的补丁,我本来会在那里问的,但显然我必须支付他们的订阅费才能问问题。无论如何,此人将蒙皮模型效果与Cel着色效果合并。他们发布了效果代码,但没有介绍如何使用它,所以我不确定我是否正确实现了它。我可以在屏幕上绘制模型,即使使用cel着色器创建的彩色轮廓,但是模型是纯黑色的。我想我可能没有正确设置模型的纹理 这是cel着色效果,未经其他人修改 celshader是Cel着色效果,纹理是模型的加载纹理。 有什么线索吗?我想你应该看看这个: 您不应在每次绘制

我实际上是在利用我在Apphub上找到的其他人的补丁,我本来会在那里问的,但显然我必须支付他们的订阅费才能问问题。无论如何,此人将蒙皮模型效果与Cel着色效果合并。他们发布了效果代码,但没有介绍如何使用它,所以我不确定我是否正确实现了它。我可以在屏幕上绘制模型,即使使用cel着色器创建的彩色轮廓,但是模型是纯黑色的。我想我可能没有正确设置模型的纹理

这是cel着色效果,未经其他人修改

celshader是Cel着色效果,纹理是模型的加载纹理。
有什么线索吗?

我想你应该看看这个:

您不应在每次绘制调用时指定效果;在加载期间这样做通常在LoadContent中进行,但我不会假设您是如何设置的


此外,在绘制过程中,您通常应该为每个效果调用mesh.Draw,正如文章中所述,而不仅仅是每个网格。

我遇到了这个错误,使用simular CelShader:

我要做的第一件事是创建一个效果,并在LoadContent中将cel着色器加载到该效果中

现在,当您绘制模型时,您不希望将模型的不同部分设置为使用可能适用于的着色器,但是我没有尝试它,而是在这里像这样在mesh.MeshParts循环中的foreach ModelMeshPart部分中设置着色器参数

celShader.Parameters["Texture"].SetValue(texture);
celShader.Parameters["World"].SetValue(world);
celShader.Parameters["TintColor"].SetValue(Color.DarkBlue.ToVector4());
celShader.CurrentTechnique = celShader.Techniques["Toon"];
还可以设置模型的索引,并将vertexbuffer填充到graphicsdevice

graphicsDevice.SetVertexBuffer(meshPart.VertexBuffer,meshPart.VertexOffset);
graphicsDevice.Indices = meshPart.IndexBuffer;
然后我们可以将着色器应用于模型并绘制它

foreach (EffectPass pass in celShader.CurrentTechnique.Passes)
{
    pass.Apply();
    graphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0,
    meshPart.NumVertices, meshPart.StartIndex, meshPart.PrimitiveCount);
}
这将解决模型为黑色时的所有错误。 希望这有帮助

我的整个绘图代码:

public void Draw(GraphicsDevice graphicsDevice, Effect theEffect)
    {
        Matrix[] bones = animationManager.GetBones();

        celShader.Parameters["Projection"].SetValue(Camera.Proj);
        celShader.Parameters["View"].SetValue(Camera.View);

        // for each model in the mesh
        foreach (ModelMesh mesh in test.Meshes)
        {
            // for each mesh part
            foreach (ModelMeshPart meshPart in mesh.MeshParts)
            {
                graphicsDevice.SetVertexBuffer(meshPart.VertexBuffer,
                        meshPart.VertexOffset);
                graphicsDevice.Indices = meshPart.IndexBuffer;

                //here i load the texture!!!!!!!!!
                Texture2D texture = ((SkinnedEffect)meshPart.Effect).Texture;


                Matrix world = Matrix.Identity;

                celShader.Parameters["Texture"].SetValue(texture);
                celShader.Parameters["World"].SetValue(world);

                celShader.Parameters["Bones"].SetValue(bones);
                celShader.Parameters["TintColor"].SetValue(Color.DarkBlue.ToVector4());

                celShader.CurrentTechnique = celShader.Techniques["Toon"];
                // for each effect pass in the cell shader
                foreach (EffectPass pass in celShader.CurrentTechnique.Passes)
                {
                    pass.Apply();

                    graphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0,
                        meshPart.NumVertices, meshPart.StartIndex, meshPart.PrimitiveCount);
                }
            }
        }
}

更新:注释掉//part.Effect.Parameters[DiffuseLightDirection].SetValuenew Vector3.5f//part.Effect.Parameters[DiffuseColor].SetValueColor.White.ToVector4//part.Effect.Parameters[DiffuseIntensity].SetValue1//part.Effect.Parameters[LineColor].SetValueColor.Black.ToVector4//part.Effect.Parameters[LineThickness].SetValuenew Vector41f;允许显示颜色,但现在皮肤乱七八糟。嘿。谢谢你的帮助,两个答案。清理了我的代码。尝试了两种方法,你的和只是简单的网格绘制。绘制,我仍然得到相同的结果,奇怪的皮肤上的模型,虽然它似乎是阴影。我想在这一点上截图可能更有用。对于具有多个外观的模型,这可能是一个问题。直接从SkindModel教程中可以看出,它有一个用于蒙皮部分的头部、夹克、裤子等图像。我想尝试一个新的模式,但我仍然在学习搅拌机。你如何加载纹理?从文件还是从网格?我将用我的全部绘图代码更新我的帖子。当模型加载时,纹理会自动加载,所以我假设是从网格加载的。
foreach (EffectPass pass in celShader.CurrentTechnique.Passes)
{
    pass.Apply();
    graphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0,
    meshPart.NumVertices, meshPart.StartIndex, meshPart.PrimitiveCount);
}
public void Draw(GraphicsDevice graphicsDevice, Effect theEffect)
    {
        Matrix[] bones = animationManager.GetBones();

        celShader.Parameters["Projection"].SetValue(Camera.Proj);
        celShader.Parameters["View"].SetValue(Camera.View);

        // for each model in the mesh
        foreach (ModelMesh mesh in test.Meshes)
        {
            // for each mesh part
            foreach (ModelMeshPart meshPart in mesh.MeshParts)
            {
                graphicsDevice.SetVertexBuffer(meshPart.VertexBuffer,
                        meshPart.VertexOffset);
                graphicsDevice.Indices = meshPart.IndexBuffer;

                //here i load the texture!!!!!!!!!
                Texture2D texture = ((SkinnedEffect)meshPart.Effect).Texture;


                Matrix world = Matrix.Identity;

                celShader.Parameters["Texture"].SetValue(texture);
                celShader.Parameters["World"].SetValue(world);

                celShader.Parameters["Bones"].SetValue(bones);
                celShader.Parameters["TintColor"].SetValue(Color.DarkBlue.ToVector4());

                celShader.CurrentTechnique = celShader.Techniques["Toon"];
                // for each effect pass in the cell shader
                foreach (EffectPass pass in celShader.CurrentTechnique.Passes)
                {
                    pass.Apply();

                    graphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0,
                        meshPart.NumVertices, meshPart.StartIndex, meshPart.PrimitiveCount);
                }
            }
        }
}