目前正在使用C#开发3D媒体引擎,我遇到了一个小难题.我找到了我的rending循环,我有一个很棒的插件架构和内容管理系统,甚至还有一个计划好的材料管道.然后引擎计划使用DirectX和OpenGL(通过'渲染器'插件),以及两个API的可编程管线.
无论如何,在本周初,我开始研究用于处理顶点的引擎抽象层(我现在已经担心这几周了).正如你们中的一些人所知,图形API之间的顶点处理并不完全相关或相同.好吧有点相关;),但不一样.在OpenGL处理中,顶点非常简单,您可以创建自定义顶点结构,将其发送到GPU,然后让着色器处理其余部分.这对于灵活的图形管线是完美的,OpenGL不需要知道每个顶点包含哪些元素.另一方面,DirectX需要我们为每个顶点结构创建声明,然后将它们发送到GPU.
问题是我不知道传递了什么类型的顶点结构,我肯定希望避免创建抽象层,该抽象层涉及通过枚举和一些抽象的"VertexDeclaration"类声明顶点的每个元素; 这会导致一些问题:
1)获得顶点元素至少可以说是一种痛苦.我可以使用一些'VertexSemantic'并询问顶点'a - z'的位置,但是当处理像骨骼动画这样的顶点时,它会有很多开销.
2)考虑到发动机的主要焦点是"新手",不是非常人性化.我希望用户能够创建自定义顶点和网格缓冲区,而不必声明大量对象,消耗宝贵的开发时间.
3)更多?
现在,我可以使用属性执行某些操作,然后在DirectX渲染器内创建顶点结构的声明.例如,继续创建一些枚举:
// for getting the format layout of the element
public enum ElementFormat
{
Float, Float2, Float3, Byte, etc, etc
}
// for determining the 'usage'
// (here is 'another' where DirectX limits vertex structures ><)
public enum ElementUsage
{
Position, Normal, Color, TextureCoord, etc, etc
}
Run Code Online (Sandbox Code Playgroud)
现在我可以创建一个用户可以应用于顶点结构中每个元素的"字段"的属性:
public class VertexElementAttribute : Attribute
{
#region Properties
/// <summary>
/// Gets the total size (in bytes) of the element.
/// </summary>
public …Run Code Online (Sandbox Code Playgroud) 我通过谷歌教授找不到任何关于此的信息,所以我在这里.获取给定的路径名称并将其粘贴到Windows资源管理器中.我发现我的代码中的bug生成了带有额外''的路径后,我偶然发现了这个.在目录\分隔符之前的路径名中...
@"C:\\pathto.\file.ext"
Run Code Online (Sandbox Code Playgroud)
在代码中,.NET将在调用时接受路径File.Create并生成文件,但是在此路径中:
@"C:\\pathto\file.ext"
Run Code Online (Sandbox Code Playgroud)
复制C:\\pathto.\file.ext到Windows资源管理器的地址栏并观看"." 消失并带你去C:\\pathto\file.ext
这是.NET和Windows的正常行为它不会导致问题,因为'.' 在传递给文件操作时,.NET和Windows都将删除它.真正的问题是数据库中的所有文件都有一个带有'.\'的文件名,但是存在于没有'.\' File.Exists()的路径中......并且也可以工作,尽管路径不是'真实的'物理地点...
这里发生了什么?