物体应该自己画吗? (几何和纹理的混合)[关闭]

Posted

技术标签:

【中文标题】物体应该自己画吗? (几何和纹理的混合)[关闭]【英文标题】:Should objects draw themselves? (Mixture of geometry and textures) [closed] 【发布时间】:2016-08-18 04:58:30 【问题描述】:

我知道类似的问题已经被问过很多次了。但是,这是另一种情况。

我正在使用 SDL2 用 C++ 编写游戏。目前,所有对象都自己绘制。他们这样做是因为他们的画法略有不同。

例如,一个 Button 包含一个矩形,用 SDL_RenderFillRect(); 绘制

按钮还包含文本,使用SDL_RenderCopy() 绘制,将SDL_TTF 生成的纹理作为参数。

此外,一个 MapView 小部件(基本上是一个可以加载 tilemap 的网格)使用包含水平和垂直 SDL_RenderDrawLine() 调用的“for”循环绘制网格。

最后,图块本身存储为纹理,使用SDL_RenderCopy() 绘制。

我了解通常最好不要让对象自己绘制。但是,由于对象的绘制方式有很多变化,我不确定另一种方式!

我认为可以为每个对象设置一个 GetTexture() 函数,使用纹理的对象可以简单地“返回纹理”,而几何对象可以生成纹理。这对我的 MapView 对象来说变得很复杂,因为当用户在游戏世界中导航时,网格会不断更新(偏移值会发生变化,并且网格会在移动时重新绘制)。

【问题讨论】:

我认为对象自己绘制没有任何问题。通常你会有一个渲染队列,这样你就可以控制绘制的内容并执行其他操作,例如剔除对象等。无论是对象自己绘制还是使用一个访问每个对象数据的函数来绘制所有对象都没有区别。您可以为每种类型的对象设置一组绘制函数并在它们之间切换。 【参考方案1】:

就像许多此类问题一样,答案是:这取决于您的程序。

如果您只是每个人都打算使用 SDL 以相同的方式绘制它,那么没有理由不这样做。另一种选择可能是为每个对象设置一个特定的渲染类,但这会使工作量加倍。将所有渲染代码放在一个类或函数中也可以正常工作,但它会很快变得庞大而复杂。

这是一个基于你的代码复杂性和你想在未来做什么的判断调用,我的建议是选择最简单的解决方案。只要您考虑了潜在的不利因素,就可以做出明智的决定。

【讨论】:

以上是关于物体应该自己画吗? (几何和纹理的混合)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

SceneKit 自定义几何纹理错误

绘制几何体

◮OpenGL-混合

3d一些术语

threejs学习day5:网格

OpenGLES 之纹理