Direct3D或XNA渲染定制台球

时间:2013-03-07 21:28:59

标签: 3d xna directx direct3d 3d-modelling

我正在开发一个数学游戏,其中数字(0-99)用于问题和答案(如标准台球,但它们通常只能达到15)。

所以,我认为以编程方式生成至少数字而不是在3DSMax或类似物中建模99个不同的球是更聪明的。

我在C#/ XNA工作,但也可以在DX11 / C ++中处理解释。

我不是在寻找代码,而是寻找一种方法:一种类似于此的子弹列表(如果这是接近正确的话):

  • 在3DS中构建一个白色且有条纹的shpere。
    • 或者,条带应该是我后来添加的纹理的一部分吗?
  • 在DrawModel期间更改球的颜色(如果是实心)或柄(如果是条纹)
  • 以某种方式将球号添加到球中,看起来与球的其他部分质量相同

也许有一种神奇的方式来获取纹理并将其包裹在球体周围而没有任何失真,然后我就可以生成纹理并将它们粘在球体上。但是你可以猜到,我不知道要走哪条路。

感谢任何方向!

2 个答案:

答案 0 :(得分:1)

您需要在纹理贴图上打印数字。这种纹理实际上是一个“贴花”,粘贴在你的球体的一部分上。实现这样一个简单的固定贴花的简单方法是编写一个像素着色器,用于确定该点是在贴花区域的内部还是外部。如果不是,您可以进行额外测试以确定像素应该是白色背景还是彩色条纹。

您可以通过为每个顶点指定合适的纹理坐标来将贴图映射到球体,或者可以(也可能更干净地),您可以编写一个像素着色器,从3D模型坐标计算纹理坐标。

无论哪种方式,你总会在球体上产生扭曲。我建议你看看map projections,这些都解决了你在平面图像和球体之间进行转换的基本问题。我特别建议查看“gnomonic”和“orthographic”投影,这些投影都很容易理解和实现。

答案 1 :(得分:0)

如果您希望使用XNA / MonoGame / ANX解决它,该方法实际上取决于您使用的是Reach配置文件还是HighDef配置文件。

根据覆盖率资料,我建议:

  1. 创建RenderTarget
  2. 将渲染目标清除为球的颜色
  3. 将白色条纹绘制到渲染目标
  4. 将数字绘制到渲染目标
  5. 动态创建(或使用现有的)球体网格
  6. 使用基本效果和渲染目标纹理
  7. 渲染球体网格

    在高调的情况下,编写像素着色器的情况是:

    1. 采用“白色”纹理,“颜色”纹理,颜色和“数字”纹理
    2. 呈现白色纹理白色
    3. 使用提供的颜色呈现颜色纹理
    4. 呈现数字纹理
    5. (我建议使用与Reach配置文件示例类似的技术渲染数字纹理。渲染文本是一种痛苦,因此可能会尽可能利用内置的东西)。 (前)XNA团队在http://create.msdn.com

      提供了一个重新着色示例