我来自OpenGL之地,所以我与glColor函数类似,以及它们如何处理使用默认GL混合方法输出的纹理。我似乎无法使GraphicsDevice.BlendFactor像glColor一样工作,但我可能没有使用正确的混合设置。不使用着色器是否可以在XNA中获得相同的功能?
例如,我想将当前颜色设置为RGB(1,0,0),如果输出,我希望白色的云显示为红色。
答案 0 :(得分:3)
无法在设备上设置颜色。颜色(即使在OpenGL中)也是一个顶点的东西。 OpenGL恰好让你在所有顶点上设置默认值。
如果您在XNA中使用SpriteBatch
,那么它会处理顶点的所有魔法,并且其大多数Draw(...)
重载都有color
参数。
如果您要自己向卡片发送顶点,请确保您的顶点格式包含Color
组件。关于如何创建自定义顶点格式的Here's a tutorial(尽管它不包含Color
组件)。
或者,您可以使用其中一种内置格式,例如VertexPositionColor
或VertexPositionColorTexture
。
值得指出的是,XNA中没有“没有着色器”。您可以使用BasicEffect
(或其他内置效果之一)对颜色数据执行预期的操作 - 也就是说 - 它会为您的纹理着色。 SpriteBatch
也在内部使用着色器。
答案 1 :(得分:2)
你也可以使用BasicEffect(或其他效果)的Fog和Alpha设置来绘制固定颜色的纹理,并仍然使用它们的原始alpha值(我将它用于使实体在被击中时变为白色的东西通过子弹)。
示例:
// Draw a silhouette in solid orange at 75% opacity
basic_effect.FogColor = new Vector3( 1.0f, 0.5f, 0.0f );
basic_effect.Alpha = 0.75f;
basic_effect.FogEnabled = true;
basic_effect.FogStart = 1;
basic_effect.FogEnd = 0;
... draw triangles ...