Articles of 渲染

纹理图案在团结

我正在研究新的方法来优化游戏以获得更好的性能。 目前我正在进行纹理图纹处理,这给我一个很难的时间。 我使用Texture2D.PackTextures制作了地图集,并将偏移量,高度和宽度值保存到文本文件中。 现在,当我将值插入到材质中时,纹理显示正确,但由于批处理需要使用相同的材​​质 – 我如何使用具有不同偏移的相同材质? 图片:所有的立方体使用相同的纹理。 只有右边的两个批次,因为他们使用相同的材​​料。

Maya中的多个FBXanimation文件

我买了一些来自统一资产商店的FBX文件的animation模型,我试图将它们导出到Maya中的PNG精灵表(用于html5 web项目)。 该文件似乎是主要的fbx(character.fbx),然后是每个名为character@animation.fbx的animation的FBX文件。 我想知道是否有一种方法可以将所有这些fbx文件导入到Maya中,然后将每个animation批量渲染为具有某些命名/目录结构的PNG帧? 目前,我可以导入主要人物fbx和animationfbx,然后渲染单个animation。 这工作,但是很乏味。 无论如何要一次渲染所有的animation?

更好的方式来处理可渲染对象的sorting和可见性?

我只是想知道是否有一种更有效的方法来处理适合已有引擎devise的可渲染组件的sorting和可见性。 我现在怎么做: 在我的SceneHandler的每个更新中,执行此操作: 检索当前在当前场景中的所有可渲染组件 将这些组件发送到RenderManager 调用RenderManager.Update 在RenderManager的每个更新中,执行以下操作: 迭代给定列表并执行遮挡testing 如果对象可见,则将其放入可见项目的新列表中 按照图层深度的顺序对可见项目列表进行sorting 当RenderManager.Draw()被调用时,RenderManager迭代可见项目列表并绘制它们 有没有什么比这更明显的方法,或者你通常这样做? 也许我可以保留所有当前场景对象的sorting列表,然后只是执行遮挡testing,因此不需要对每个更新进行sorting? 所建议的方法的优点和缺点,非常感谢。

用于户外场景的边界卷层次结构

几个星期前,我开始使用一个非常简单的graphics引擎,并完成了一个简单的场景图,现在我正要创建一个边界卷层次结构。 我从来没有想过这么多,现在我卡住了。 基本上我目前的目标是实现视锥体剔除,我知道如何做到这一点,但我不知道如何生成一个边界卷层次结构。 我的问题是我不知道如何在空间上创建边界框。 我的场景图允许我将对象组合在一起,而现在我正在这样做 [object_group1,object_group2,….object_groupN] 而现在我只是检查object_group是否在我的视锥内,但这只是一个天真的解决scheme。 你会推荐哪种algorithm/数据结构用于户外场景?

我应该什么时候使用实例化与常量缓冲区?

我听说过一些关于实例化的东西,并且明白这对于稍微改变多次绘制同一个对象是有用的。 这样做速度更快,因为每帧调用draw函数一次,并在每个帧更新一次缓冲区(在本例中为实例缓冲区),同时使用常量缓冲区,例如,如果需要世界matrix,则必须每隔一次更新常量缓冲区目的。 但是如果我只有一个对象,使用一个不变的缓冲区,实例化会更快(或者至less是一样快)吗? 通过实例化,您只需要调用一个更新缓冲区函数(对于顶点实例缓冲区),而使用CB则需要两个调用:一个用于顶点缓冲区,另一个用于常量缓冲区。 关于实例的另一个问题: 因为我必须每帧更新一次实例缓冲区,所以我需要用DYNAMIC_USAGE创建它,并且用一个字节宽度表示一次调用可以绘制的最大对象数量。 例如,如果我想传递一个matrix,我需要insBufferdesc.bwitdh= sizeof(matrixtype)*maxNumObjs 。 这是正确的吗? 鉴于maxNumObjs是20,我只想渲染10个objs,我应该只更新缓冲区的前10个matrix,并调用drawInstanced(…, 10) 。 如果我不使用所有的缓冲区,我会得到一些错误?

游戏循环之间的input处理

这对你来说可能是显而易见的,但由于我是一个编程新手,所以我带着一个具体的问题。 我的游戏引擎中有三个循环,分别是input-loop,update-loop和render-loop。 更新循环设置为每秒10个刻度,固定的时间步长,渲染循环的上限约为60 fps,input循环的运行速度尽可能快。 我正在使用提供这样的东西的Javascript框架之一,但它并不重要。 比方说,我正在渲染一个瓦片贴图,而渲染哪些元素的视图取决于在按键过程中被修改的相机状运动variables。 这只是关于相机/视口和渲染,这里没有涉及游戏物理。 而现在,我如何处理这些循环之间的input事件,以保持一致的引擎反应? 我是否应该读取当前使用input修改的variables,并在更新循环中执行一些所需的计算,并共享结果,以便可以在渲染循环中进行插值? 或者直接在渲染循环内部读取input效果,并把所需的计算内? 我认为在一个较低的滴答速率的更新循环内解释用户input将是不准确的,并且在最终视图中使用插值进行渲染时没有反应。 游戏整体如何完成?

我如何绘制一个特定的游戏对象到Unity中的纹理?

我只需要将一些特定的对象绘制到纹理中(使用它们的材质),然后使用RenderTexture作为另一个对象的纹理。 我认为Graphics.DrawMesh()和Graphics.SetRenderTarget()会有帮助,但我不确定。 最终,我试图创建折射水,它将折射只有指定的GameObject ,而不是图层。 我怎样才能做到这一点?

设置一个摄像头,让世界看起来很大

我试图configuration我的相机,给一个普通大小的玩家在一个巨大的房间的印象。 由于单位是武断的,我认为这应该是可能的(尽管事实上,房间技术上是24×24米大,我希望它感觉更像一个飞机库)。 我已经尝试调整视角(约40度),这有助于一些,但我不能动摇我在正常大小的房间里,而不是一个正常大小的人在一个巨大的房间里的小人物的感觉。 那么这个场景的渲染方式呢就是把这个交给我的眼睛。 还是仅仅是缺乏参考点? 如果影响答案,我正在使用虚幻引擎。

如何在DirectX11 C ++中渲染顶点缓冲区(特别是box2d的b2Draw)

我有所有的DirectX11设备等设置和使用DirectXTK的SpriteBatch和目前试图实现一个b2Draw类来绘制我的box2d物理世界。 我不知道如何渲染b2Draw给我的顶点缓冲区。 我目前的代码, void DebugDraw::DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) { Vertex* vertexData = new Vertex[vertexCount * 3]; for (int i = 0; i < vertexCount; i++) { vertexData[i] = { DirectX::XMFLOAT3(vertices[i].x, vertices[i].y, 0) }; } // Create vertex buffer D3D11_SUBRESOURCE_DATA subresourceData; subresourceData.pSysMem = vertexData; ID3D11Buffer* vertexBuffer; D3D11_BUFFER_DESC bd; ZeroMemory(&bd, sizeof(bd)); bd.Usage = […]

着色器 – 实时纹理遮罩

首先要记住的是使用RGBA值进行遮罩。 有了这个,你可以获得这种纹理和这种结果。 但是有了这个,你最多可以在纹理内部存储4个蒙版,并且在最多4个纹理之间进行混合。 我想知道是否有一种方法来存储超过4个口罩内的纹理,并能够使用此口罩纹理混合超过4个纹理。 目标是尽可能多地在纹理中存储掩膜数据。 可能吗 ? 怎么样 ?