小编rap*_*tor的帖子

具有许可许可证的强大,快速复杂的多边形(带孔)三角剖分c/c ++库

我是开源游戏Bitfighter的开发者.根据以下SO帖子,我们使用优秀的"三角"库进行网格区生成,以便与我们的游戏内AI(机器人)一起使用:

带孔的多边形三角剖分

然而,当我们想要为Debian打包我们的游戏时,我们遇到了一个小问题 - 使用'Triangle'库将使我们的游戏被视为'非自由'.

我们对"三角"图书馆的表现非常满意,并不真的想放弃它; 但是,我们也不喜欢处理许可证问题.因此,我们已着手寻找一种合适的,允许许可的替代品,它可以在稳健性和速度方面与"三角形"相匹配.

我们正在寻找一个C或C++库,用于将大型复杂区域划分为三角形,可以处理以任何方式放置在一起的任何类型的不规则多边形以及孔.稳健性是我们的首要需求,速度几乎同样重要.

我找到了poly2tri,但是它遇到了一个错误,它无法处理具有重合边的多边形.

我们已经找到了几个库,但似乎都有一个或另一个问题:要么太慢,要么不处理漏洞,或者遇到一些bug.目前我们正在测试polypartition,我们寄予厚望.

什么是伟大的'三角'图书馆的最佳替代品,但有许可证?

c c++ open-source triangulation

16
推荐指数
1
解决办法
2万
查看次数

OpenGL文本渲染方法和权衡

背景

我在游戏Bitfighter上工作.我们仍然与OpenGL 1.1兼容并为OSX,Windows和Linux编译.

我们使用矢量图形来处理所有事情,包括文本渲染和操作.我们使用GLUT中稍微修改过的'FontStrokeRoman'变体,它只是一堆静态线.我们喜欢这个,因为它似乎表现得非常好,易于旋转/缩放/操纵.我们还允许进行游戏内聊天,以便即时绘制文本.

问题

我们想要使用更多/不同的字体.

我们已经找到了我们喜欢的其他几种字体,但它们都是TTF类型的字体,它们构建为多边形(带曲线等)而不是笔画或刺.这带来了一些问题:

  • 我们必须使用纹理(我们在游戏中到目前为止已经避免了)
  • 它们不容易调整大小/可旋转/等.
  • 性能显着降低(理论上?)

我们已经尝试将TTF字体转换为多边形点阵列,然后对填充进行三角测量.然而,这很难很好地渲染 - 在这种情况下,像素提示/抗锯齿似乎很难做到.

我们甚至尝试使用像'campskeleton'这样的库对多边形字体进行镂空,因此我们可以输出矢量笔划字体(看起来不太成功).

我们应该做什么?

我知道这个问题有点笼统.我们希望保持性能和文本操作能力,但能够使用更好的字体.我对任何方向的任何建议持开放态度.

一些解决方案可能是以下答案:

  • 我们如何正确地对基于多边形的文本进行反别法并保持性能?
  • 纹理真的比静态点阵列更差吗?也许我有一个错误的假设
  • 纹理字体可以快速调整大小/旋转吗?
  • 完全不同的东西?

c++ opengl performance fonts

11
推荐指数
1
解决办法
4130
查看次数

Lua,c ++和消失的元数据

背景

我和Watusimoto在Bitfighter游戏上合作.我们使用LuaWrapper的变体将我们的c ++对象与游戏中的Lua对象连接起来.我们还使用称为lua-vec的Lua变体来加速向量操作.

我们一直在努力解决一段时间没有找到错误的bug.将发生随机崩溃,表明腐败的元数据.有关Watusimoto的帖子,请参阅此处.我不确定这是因为一个腐败的metatable,并且看到了一些我想在这里问的非常奇怪的行为.

问题表现形式

作为一个例子,我们创建一个对象并将其添加到这样的级别:

t = TextItem.new()
t:setText("hello")
levelgen:addItem(t)
Run Code Online (Sandbox Code Playgroud)

但是,游戏有时会(并非总是)崩溃.出错:

attempt to call missing or unknown method 'addItem' (a nil value)
Run Code Online (Sandbox Code Playgroud)

使用上面提到的Watusimoto帖子中给出的建议,我已将最后一行更改为以下内容:

local ok, res = pcall(function() levelgen:addItem(t) end)

if not ok then
    local s = "Invalid levelgen value: "..tostring(levelgen).." "..type(levelgen).."\n"

    for k, v in pairs(getmetatable(levelgen)) do 
        s = s.."meta "..tostring(k).." "..tostring(v).."\n"
    end

    error(res..s)
end
Run Code Online (Sandbox Code Playgroud)

这打印出metatable,levelgen如果错误的话从它调用一个方法.

然而,这很疯狂,当它失败并打印出metatable时,metatable 正是应该如何(使用正确的addItem调用和所有内容).如果我levelgen在脚本加载时打印metatable ,并且在上面使用它时失败pcall,它们是相同的,每个调用和指向userdata的指针是相同的,应该是它.

好像metatable levelgen …

c++ lua metatable

5
推荐指数
1
解决办法
477
查看次数

使用 SDL 和 OpenGL 在 MacOS 上正确处理 HighDPI

我尝试在 MacOS 上为我的游戏Bitfighter进行高 DPI 渲染,结果总是看起来很糟糕,就像低分辨率游戏的放大版本。

该游戏使用 SDL2 + OpenGL,我已正确启用SDL_WINDOW_ALLOW_HIGHDPI窗口标志,并在 Info.plist 中使其具有 HighDPI 感知。这一切正常,我得到了更高分辨率的标题栏。我使用SDL_GL_GetDrawableSize并且它正确返回比窗口大小大 2 倍的像素大小,但以下重新缩放它的技术不会产生好的结果:

  • 使用glViewport窗口坐标
  • glViewport与可绘制坐标一起使用,然后glOrtho按比例缩放(如 SDL 文档中的建议README-ios.md

两者都显示像素矢量图形。我该怎么做才能让 OpenGL 在 MacOS 高 DPI 下画得更好?

谢谢。

opengl macos sdl highdpi

5
推荐指数
0
解决办法
573
查看次数

标签 统计

c++ ×3

opengl ×2

c ×1

fonts ×1

highdpi ×1

lua ×1

macos ×1

metatable ×1

open-source ×1

performance ×1

sdl ×1

triangulation ×1