2010-09-21 69 views
1

我来自OpenGL的土地,所以我与glColor函数类似,以及它们如何使用默认GL混合方法输出的纹理。我似乎无法让GraphicsDevice.BlendFactor像glColor一样工作,但我可能没有使用正确的混合设置。如果不使用着色器,可以在XNA中获得相同的功能吗?例如,我想将当前颜色设置为RGB(1,0,0),并且我希望白色云在输出时显示为红色。XNA glColor等效

回答

3

无法在设备上设置颜色。颜色(即使在OpenGL中)是一个顶点的东西。 OpenGL只是让你设置所有顶点的默认值。

如果您在XNA中使用SpriteBatch,那么它将使用顶点处理所有魔术,并且其大部分Draw(...)重载都有color参数。

如果您自己发送顶点到卡上,请确保您的顶点格式包含Color组件。 Here's a tutorial关于如何创建自定义顶点格式(尽管它不包含Color组件)。

或者,您可以使用其中一种内置格式,如VertexPositionColorVertexPositionColorTexture

值得指出的是,在XNA中没有“没有着色器”。您可以使用BasicEffect(或其他内置效果之一),它可以使用颜色数据完成预期的工作,也就是说,它可以为您的纹理着色。并且SpriteBatch也在内部使用着色器。

+1

我试图实现与BasicEffect这种效果。我更愿意说没有'自定义'着色器。看起来你甚至不能在这个设备上自己创建=(..我有一个有数百个多边形的对象,我需要对颜色和alpha进行脉冲排序,从设备上解除顶点缓冲区对象并重置所有顶点的顶点颜色和alpha对我来说似乎不是那么好,而BlendFactor似乎对我没有任何帮助,也许我错过了一些东西? – Kyle 2010-09-22 01:53:18

+0

啊 - 所以这更多的是关于BasicEffect的一个问题,尝试一下照明选项,我认为'AmbientLightColor'会做你想做的(或者如果你的模型被点亮了,那么就是'DiffuseColor') – 2010-09-22 02:44:41

+0

DiffuseColor绝对有效!使用Alpha给出了整个颜色/ alpha功能,并且这个功能可以与LightingEnabled:false一起使用,所以我相信它也可以保存在一些着色器操作中。感谢您的帮助! – Kyle 2010-09-22 03:15:06

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 ...