Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在着色器之间是否存在需要重置的状态_C#_Xna_Shader_Xna 4.0 - Fatal编程技术网

C# 在着色器之间是否存在需要重置的状态

C# 在着色器之间是否存在需要重置的状态,c#,xna,shader,xna-4.0,C#,Xna,Shader,Xna 4.0,我刚开始使用XNA的着色器,我遇到了一些我几乎立刻就不理解的行为 我创建了一个简单的场景,其中有一个纹理框和一些地面供它坐,由一个使用重复纹理的纹理四边形组成(因此我的纹理坐标从0,0到10,10,使其重复10次)。最初,这两个类都使用BasicFect类 然后,我按照教程创建了我的第一个着色器,并将其用于立方体-只不过是一个在坐标坐标系返回纹理颜色的着色器,使我获得了与以前相同的纹理立方体 然而,奇怪的事情发生了——突然,地面基本上是一种纯色,有两条模糊的边缘,角落里有一个合适的纹理实例。纹理

我刚开始使用XNA的着色器,我遇到了一些我几乎立刻就不理解的行为

我创建了一个简单的场景,其中有一个纹理框和一些地面供它坐,由一个使用重复纹理的纹理四边形组成(因此我的纹理坐标从0,0到10,10,使其重复10次)。最初,这两个类都使用BasicFect类

然后,我按照教程创建了我的第一个着色器,并将其用于立方体-只不过是一个在坐标坐标系返回纹理颜色的着色器,使我获得了与以前相同的纹理立方体

然而,奇怪的事情发生了——突然,地面基本上是一种纯色,有两条模糊的边缘,角落里有一个合适的纹理实例。纹理不再重复。我改变了绘制立方体和地面的顺序,但没有效果,只是注释了立方体解决的问题

然后我查看了我的着色器代码,大部分是从教程中复制的,看到它为AddressU和AddressV指定了钳制。将其更改为“包裹”修复了所有问题,但仍然给我留下了一个问题-为什么一个着色器的纹理包裹逻辑会影响基本着色器?这是一种正常的行为吗?我是否需要进行某种状态保存,或者这是否表明我的代码中可能存在另一个bug

groundEffect.View = camera1.View; // BasicEffect
groundEffect.Projection = projection;
groundEffect.World = Matrix.CreateTranslation(0, -1.5f, 0);
groundEffect.TextureEnabled = true;
groundEffect.Texture = groundTexture;
GraphicsDevice.Indices = groundIndexBuffer;
GraphicsDevice.SetVertexBuffer(groundVertexBuffer);
foreach (EffectPass pass in groundEffect.CurrentTechnique.Passes)
{
    pass.Apply();
    GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, groundVertexBuffer.VertexCount, 0, groundIndexBuffer.IndexCount / 3); 
}


shaderEffect.Parameters["View"].SetValue(camera1.View);
shaderEffect.Parameters["Projection"].SetValue(projection);
shaderEffect.Parameters["World"].SetValue(modelPosition);
shaderEffect.Parameters["ModelTexture"].SetValue(boxTexture);
GraphicsDevice.Indices = model.IndexBuffer;
GraphicsDevice.SetVertexBuffer(model.VertexBuffer);
foreach (EffectPass pass in shaderEffect.CurrentTechnique.Passes)
{
    pass.Apply();
    GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, model.VertexBuffer.VertexCount, 0, model.IndexBuffer.IndexCount / 3);    
}

渲染状态由四个状态对象控制:

GraphicsDevice.BlendState
GraphicsDevice.DepthStencilState
GraphicsDevice.RasterizerState
GraphicsDevice.SamplerStates[] // one for each sampler
中介绍了它们在XNA 4中的介绍

所有状态更改都会通过这些变量进行,或者可以在
.fx
文件中进行设置

IIRC,XNA内置的
效果
对象不使用任何一种方法设置状态,尽管
SpriteBatch
可以

根据您提供的代码,我无法确定您的案例中是什么设置了状态。通常,我会猜测
SpriteBatch
是罪魁祸首()——因为这经常出现。但也许这是你的
shaderEffect
中的某些东西

在任何情况下,只需在渲染之前设置所需的状态是完全合理的。以下是3D渲染的典型状态:

GraphicsDevice.BlendState = BlendState.Opaque;
GraphicsDevice.DepthStencilState = DepthStencilState.Default;
GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;

渲染状态由四个状态对象控制:

GraphicsDevice.BlendState
GraphicsDevice.DepthStencilState
GraphicsDevice.RasterizerState
GraphicsDevice.SamplerStates[] // one for each sampler
中介绍了它们在XNA 4中的介绍

所有状态更改都会通过这些变量进行,或者可以在
.fx
文件中进行设置

IIRC,XNA内置的
效果
对象不使用任何一种方法设置状态,尽管
SpriteBatch
可以

根据您提供的代码,我无法确定您的案例中是什么设置了状态。通常,我会猜测
SpriteBatch
是罪魁祸首()——因为这经常出现。但也许这是你的
shaderEffect
中的某些东西

在任何情况下,只需在渲染之前设置所需的状态是完全合理的。以下是3D渲染的典型状态:

GraphicsDevice.BlendState = BlendState.Opaque;
GraphicsDevice.DepthStencilState = DepthStencilState.Default;
GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;