小编Nor*_*der的帖子

在OpenGL批处理渲染器中批处理任意顶点数据

我正在使用XNA/MonoGame界面在OpenGL中制作2D批量渲染器,但我遇到了一个小设计问题,我正在寻找一些输入.目前,您可以通过以下四种方式提交顶点数据:

void Render(const Sprite& sprite);
void Render(const Shape& shape);
void Render(const Vertex* vertices, unsigned int length);
void Render(const Vertex* vertices, unsigned int length, const Texture* texture);
Run Code Online (Sandbox Code Playgroud)

精灵包含四个顶点,颜色和纹理坐标,而其他三个顶点可以包含任意数字(精灵和形状具有唯一的变换).一切都可以纹理或无纹理.我想批量处理所有内容以减少状态更改和OpenGL绘制调用的次数.我觉得合理地假设大多数提交都有共享顶点,这样我就可以使用glDrawElements而不是glDrawArrays,但是我很难弄清楚如何按照上面描述的方法正确地批量处理.

XNA/MonoGame sprite batchers的工作原理是它们只使用纹理四边形/三角形而不是任意形状.或者,我可以像SFML渲染器一样为每个可绘制对象发出一个绘制调用,但这会破坏批渲染的目的.

我觉得我的渲染器正试图"做所有事情",这是我想要避免的事情,因为在我的经历中它通常会变得过于复杂.

我问的是:我怎样才能重新设计我的渲染器?我可以为不同的提交保留单独的批次列表吗?我可以以某种方式模块化我的渲染器吗?我应该只允许在XNA/MonoGame中完成纹理对象吗?

c++ opengl renderer c++11

4
推荐指数
1
解决办法
2533
查看次数

如何在C++字体库中支持不同的OpenGL版本/扩展

我计划重写一个小的C++ OpenGL字体库我使用FreeType 2做了一段时间,因为我最近发现了对更新的OpenGL版本的更改.我的代码使用立即模式和一些函数调用我很确定现在已经弃用了,例如glLineStipple.

我非常希望支持一系列OpenGL版本,以便代码在可能的情况下使用例如VBO,或者在没有其他可用的情况下退回到立即模式等等.我不知道怎么回事.Afaik,您无法进行编译时检查,因为您需要在运行时创建有效的OpenGL上下文.到目前为止,我已经提出了以下建议(灵感来自其他线程/网站):

  • 使用GLEW在绘图函数中进行运行时检查并检查功能支持(例如glLineStipple)

  • 使用一些可以在编译时指定的#define和其他预处理程序指令来编译可以使用不同OpenGL版本的不同版本

  • 编译支持不同OpenGL版本的不同版本,并将每个版本作为单独的下载提供

  • 使用脚本(Python/Perl)发送库,该脚本检查系统上的OpenGL版本(如果可能/可靠)并对源进行适当的修改,使其适合用户的OpenGL版本

  • 仅针对较新的OpenGL版本,并放弃对以下任何内容的支持

无论如何我可能会使用GLEW来轻松加载扩展.

后续行动: 根据您非常有用的答案,我试图根据我的旧代码添加几行,这里是一个片段(没有测试/完成).我在config头中声明了相应的函数指针,然后在初始化库时,我尝试获得正确的函数指针.如果VBO失败(指针为null),我会回到显示列表(不推荐使用3.0),最后回到顶点数组.如果是fx,我应该(也许?)检查可用的ARB扩展名.VBO无法加载或太多工作?这会是一个坚实的批评吗?评论赞赏:)

#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
    #define OFL_WINDOWS
    // other stuff...
    #ifndef OFL_USES_GLEW
        // Check which extensions are supported
    #else
        // Declare vertex buffer object extension function pointers
        PFNGLGENBUFFERSPROC          glGenBuffers          = NULL;
        PFNGLBINDBUFFERPROC          glBindBuffer          = NULL;
        PFNGLBUFFERDATAPROC          glBufferData          = NULL;
        PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = NULL;
        PFNGLDELETEBUFFERSPROC       glDeleteBuffers       = NULL;
        PFNGLMULTIDRAWELEMENTSPROC   glMultiDrawElements   = NULL;
        PFNGLBUFFERSUBDATAPROC       glBufferSubData       = NULL;
        PFNGLMAPBUFFERPROC           glMapBuffer           = NULL;
        PFNGLUNMAPBUFFERPROC         glUnmapBuffer         = NULL;
    #endif
#elif some_other_system
Run Code Online (Sandbox Code Playgroud)

初始化功能: …

c++ opengl

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

标签 统计

c++ ×2

opengl ×2

c++11 ×1

renderer ×1