OpenGL 离屏渲染

2023-11-30

我有一个应用程序,可以创建 3D 模型并从中导出图像。我用这个例子来做到这一点:

#include <windows.h>
#include <GL\GL.h>
#include <GL\glu.h>
#include <GL\glut.h>
#include <opencv2\highgui.hpp>

GLfloat light_diffuse[] = { 1.0, 0.0, 0.0, 1.0 };  /* Red diffuse light. */
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };  /* Infinite light location. */
GLfloat n[6][3] = {  /* Normals for the 6 faces of a cube. */
    { -1.0, 0.0, 0.0 },{ 0.0, 1.0, 0.0 },{ 1.0, 0.0, 0.0 },
    { 0.0, -1.0, 0.0 },{ 0.0, 0.0, 1.0 },{ 0.0, 0.0, -1.0 } };
GLint faces[6][4] = {  /* Vertex indices for the 6 faces of a cube. */
    { 0, 1, 2, 3 },{ 3, 2, 6, 7 },{ 7, 6, 5, 4 },
    { 4, 5, 1, 0 },{ 5, 6, 2, 1 },{ 7, 4, 0, 3 } };
GLfloat v[8][3];  /* Will be filled in with X,Y,Z vertexes. */

void drawBox(void)
{
    int i;

    for (i = 0; i < 6; i++) {
        glBegin(GL_QUADS);
        glNormal3fv(&n[i][0]);
        glVertex3fv(&v[faces[i][0]][0]);
        glVertex3fv(&v[faces[i][1]][0]);
        glVertex3fv(&v[faces[i][2]][0]);
        glVertex3fv(&v[faces[i][3]][0]);
        glEnd();
    }
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    drawBox();
    glFlush();
}

void init(void)
{
    /* Setup cube vertex data. */
    v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1;
    v[4][0] = v[5][0] = v[6][0] = v[7][0] = 1;
    v[0][1] = v[1][1] = v[4][1] = v[5][1] = -1;
    v[2][1] = v[3][1] = v[6][1] = v[7][1] = 1;
    v[0][2] = v[3][2] = v[4][2] = v[7][2] = 1;
    v[1][2] = v[2][2] = v[5][2] = v[6][2] = -1;

    /* Enable a single OpenGL light. */
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);

    /* Use depth buffering for hidden surface elimination. */
    glEnable(GL_DEPTH_TEST);

    /* Setup the view of the cube. */
    glMatrixMode(GL_PROJECTION);
    gluPerspective( /* field of view in degree */ 40.0,
        /* aspect ratio */ 1.0,
        /* Z near */ 1.0, /* Z far */ 10.0);
    glMatrixMode(GL_MODELVIEW);
    gluLookAt(0.0, 0.0, 5.0,  /* eye is at (0,0,5) */
        0.0, 0.0, 0.0,      /* center is at (0,0,0) */
        0.0, 1.0, 0.);      /* up is in positive Y direction */

                            /* Adjust cube position to be asthetic angle. */
    glTranslatef(0.0, 0.0, -1.0);
    glRotatef(60, 1.0, 0.0, 0.0);
    glRotatef(-20, 0.0, 0.0, 1.0);
}

int main(int argc, char **argv)
{
    int width = 500, height = 500;

    /********* i want to remove this section ************/
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutCreateWindow("red 3D lighted cube");
    /********* i want to remove this section ************/

    init();
    display();

    BYTE* result = new BYTE[3 * width *height];
    glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, result);
    cv::Mat img(width, height, CV_8UC3);
    img.data = result;
    cv::flip(img, img, 0);
    cv::imwrite("D:\\result_off.jpg", img);

    return 0;             /* ANSI C requires main to return int. */
}

它执行正确,但是当我运行该程序时,它会创建一个窗口并显示它,然后将其删除。

我尝试删除 glut* 函数并运行我的程序,但运行时它没有导出任何内容。我用谷歌搜索并发现我应该使用 Framebuffer 但我找不到任何示例。

如何设置程序在渲染 3D 模型时不显示任何窗口?

注意:我想在Windows和Linux中运行这个程序。


我刚刚查看了我为 Windows 所做的源代码。由于这是对生产代码的研究(因此使用了我们生产代码的其他内容),我无法按原样提供它。我在这里展示的是一个精简版本,它应该显示它是如何工作的:

// standard C/C++ header:
#include <iostream>

// Windows header:
#include <Windows.h>

using namespace std;

int main(int argc, char **argv)
{
  if (argc < 3) {
    cerr << "USAGE: " << argv[0]
      << " FILE [FILES...] IMG_FILE" << endl;
    return -1;
  }
  // Import Scene Graph
  // excluded: initialize importers
  // excluded: import 3d files
#ifdef _WIN32
  // Window Setup
  // set window properties
  enum { Width = 1024, Height = 768 };
  WNDCLASSEX wndClass; memset(&wndClass, 0, sizeof wndClass);
  wndClass.cbSize = sizeof(WNDCLASSEX);
  wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS;
  wndClass.lpfnWndProc = &DefWindowProc;
  wndClass.cbClsExtra = 0;
  wndClass.cbWndExtra = 0;
  wndClass.hInstance = 0;
  wndClass.hIcon = 0;
  wndClass.hCursor = LoadCursor(0, IDC_ARROW);
  wndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
  wndClass.lpszMenuName = 0;
  wndClass.lpszClassName = "WndClass";
  wndClass.hIconSm = 0;
  RegisterClassEx(&wndClass);
  // style the window and remove the caption bar (WS_POPUP)
  DWORD style = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_POPUP;
  // Create the window. Position and size it.
  HWND hwnd = CreateWindowEx(0,
    "WndClass",
    "",
    style,
    CW_USEDEFAULT, CW_USEDEFAULT, Width, Height,
    0, 0, 0, 0);
  HDC hdc = GetDC(hwnd);
  // Windows OpenGL Setup
  PIXELFORMATDESCRIPTOR pfd; memset(&pfd, 0, sizeof pfd);
  pfd.nSize = sizeof(pfd);
  pfd.nVersion = 1;
  pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
  pfd.iPixelType = PFD_TYPE_RGBA;
  pfd.cColorBits = 32;
  pfd.cDepthBits = 16;
  pfd.cStencilBits = 8;
  pfd.iLayerType = PFD_MAIN_PLANE;
  // get the best available match of pixel format for the device context
  int iPixelFormat = ChoosePixelFormat(hdc, &pfd);
  // make that the pixel format of the device context 
  SetPixelFormat(hdc, iPixelFormat, &pfd);
  // create the context
  HGLRC hGLRC = wglCreateContext(hdc);
  wglMakeCurrent(hdc, hGLRC);
#endif // _WIN32
  // OpenGL Rendering Setup
  /* excluded: init our private OpenGL binding as
   * the Microsoft API for OpenGL is stuck <= OpenGL 2.0
   */
  // create Render Buffer Object (RBO) for colors
  GLuint rboColor = 0;
  glGenRenderbuffers(1, &rboColor);
  glBindRenderbuffer(GL_RENDERBUFFER, rboColor);
  glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, Width, Height);
  glBindRenderbuffer(GL_RENDERBUFFER, 0);
  // create Render Buffer Object (RBO) for depth
  GLuint rboDepth = 0;
  glGenRenderbuffers(1, &rboDepth);
  glBindRenderbuffer(GL_RENDERBUFFER, rboDepth);
  glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, Width, Height);
  glBindRenderbuffer(GL_RENDERBUFFER, 0);
  // create Frame Buffer Object (FBO)
  GLuint fbo = 0;
  glGenFramebuffers(1, &fbo);
  glBindFramebuffer(GL_FRAMEBUFFER, fbo);
  // attach RBO to FBO
  glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
    GL_RENDERBUFFER, rboColor);
  glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
    GL_RENDERBUFFER, rboDepth);
  // GL Rendering Setup
  // excluded: prepare our GL renderer
  glViewport(0, 0, Width, Height);
  glClearColor(0.525f, 0.733f, 0.851f, 1.0f);
  glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
  /* compute projection matrix from
   * - field of view (property fov)
   * - aspect ratio of view
   * - near/far clip distance (properties dNear and dFar).
   */
  const DegreeD fov(30.0);
  const double dNear = 0.1, dFar = 100.0;
  const double ar = (float)Width / Height;
  const double d = ::tan(fov / 2.0) * 2.0 * dNear;
  // excluded: construct a projection matrix for perspective view
  // excluded: determine bounding sphere of 3D scene
  // excluded: compute camera and view matrix from the bounding sphere of scene
  // excluded: OpenGL rendering of 3d scene
  // read image from render buffer
  // excluded: prepare image object to store read-back
  //Image::Object img(4, Image::BottomToTop);
  //img.set(Width, Height, Image::RGB24);
  //const size_t bytesPerLine = (3 * Width * 4 + 3) / 4;
  //glReadPixels(0, 0, Width, Height, GL_RGB, GL_UNSIGNED_BYTE, img.getData());
  // store image
  const string filePath = argv[argc - 1];
  // excluded: export image in a supported image file format
  // clean-up
  // excluded: clean-up of 3D scene (incl. OpenGL rendering add-ons)
  glDeleteFramebuffers(1, &fbo);
  glDeleteRenderbuffers(1, &rboColor);
  glDeleteRenderbuffers(1, &rboDepth);
#ifdef _WIN32
  wglMakeCurrent(NULL, NULL);
  wglDeleteContext(hGLRC);
#endif // _WIN32
  // done
  return 0;
}

我没有检查这是否可以编译(如上所述)。它被从我这边在 Windows 10 上编译和运行的代码中删除。


关于 OpenGL 和 Windows 的注意事项:

我自己进行了 GL 绑定,因为 Microsoft Windows OpenGL API 不支持 OpenGL 3.0 或更高版本。 (我可以使用像这样的库glfw)这意味着我必须将函数地址分配给函数指针(以更正函数原型),以便我可以使用 C 函数调用正确地调用 OpenGL 函数。

授予功能的可用性if我安装了适当的硬件和适当的驱动程序。 (可以检查驱动程序是否提供某些功能。)

如果此类绑定函数调用失败(例如,出现分段错误),可能的原因可能是:

  1. 被调用函数的签名错误。 (我使用从 khronos.org 下载的标头来授予正确的原型。希望驱动程序提供商也这样做。)

  2. 该函数在驱动程序中不存在。 (我使用的函数是已安装驱动程序支持的 OpenGL 标准的一部分。该驱动程序支持 OpenGL 4.x,但我只需要 OpenGL 3.x(至少到目前为止)。)

  3. 在使用函数指针之前必须对其进行初始化。 (我已经编写了一个未在代码中公开的初始化。这是我放置注释的地方/* excluded: init our private OpenGL binding as the Microsoft API for OpenGL is stuck <= OpenGL 2.0 */.

为了说明这一点,一些代码示例:

在我的 OpenGL 初始化函数中,我执行以下操作:

  glGenFramebuffers
    = (PFNGLGENFRAMEBUFFERSPROC)wglGetProcAddress(
      "glGenFramebuffers");

标题提供:

extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;

PFNGLGENFRAMEBUFFERSPROC由提供glext.h我从下载kronos.org:

typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers);

wglGetProcAddress()由 Microsoft Windows API 提供。

A Note about OpenGL and Linux:

If H/W and the installed driver supports the desired OpenGL standard, functions can be used as usual by

  1. including the necessary headers (e.g. #include <GL/gl.h>)

  2. linking the necessary libraries (e.g. -lGL -lGLU).


德哈斯评论道:

绝对不能保证 GL 3.x 函数可以通过任何方式导出libGL.so一个正在使用,即使它们被导出,也不能保证该功能受到支持(即,mesa 对所有驱动程序后端使用相同的前端库,但每个驱动程序可能只支持功能的子集)。您必须在两个平台上使用扩展机制。

我无法提供如何处理此问题的简单建议,也没有宝贵的实践经验。所以,我想至少提供我通过谷歌搜索找到的这些链接(来自 khronos.org):

  • 加载 OpenGL 函数

  • OpenGL上下文

  • OpenGL加载库.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL 离屏渲染 的相关文章

  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • 如果使用 SingleOrDefault() 并在数字列表中搜索不在列表中的数字,如何返回 null?

    使用查询正数列表时SingleOrDefault 当在列表中找不到数字时 如何返回 null 或像 1 这样的自定义值 而不是类型的默认值 在本例中为 0 你可以使用 var first theIntegers Cast
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • Spring用额外的登录参数记住我

    在 spring mvc 应用程序中 我在登录屏幕上捕获一个附加的 位置 参数 并使用它除了用户名之外进行身份验证 所以在 loadUserByUsername 中我的sql查询是这样的 select from user where use
  • 将字符串值转换为变量名 |字符串值包含变量名称

    Double new val 10 0 String a new String b val Double v1 25 0 Double result 0 0 Public void getVal String variable c cont
  • 如何改变winform DataGridview标题的颜色?

    我尝试过这样做 但没有成功 是否可以 做到这一点的方法是设置EnableHeadersVisualStyles数据网格视图的标志False 并通过设置背景颜色ColumnHeadersDefaultCellStyle BackColor财产
  • 从 Uri 获取单独的查询参数[重复]

    这个问题在这里已经有答案了 我有一个 uri 字符串 例如 是否有一个现有函数可以将查询参数字符串转换为字典 就像 ASP NET Context Request 那样 我正在编写一个控制台应用程序而不是一个 Web 服务 因此没有 Con
  • 从目录中选择随机文件

    我正在尝试创建一个网站 用户可以提交照片 然后在另一个页面上随机地一张一张地查看其他照片 我有一个名为 uploads 的目录 用于提交图片 我在读取文件中的图片时遇到问题 我只想从上传目录中随机选择一张图片并将其显示在页面上 任何建议表示
  • 使用 Google App 脚本在工作表中创建日历活动并想要添加参与者

    我正在尝试使用 Google App Script 在工作表中创建日历事件 我对此很陌生 该表包含活动的详细信息 日期 时间 活动标题和嘉宾名单 以及日历 ID 这是培训日历 我想让最终用户轻松填写表格上的信息 单击 立即安排 然后运行脚本
  • Hartl 对 config.serve_static_files 的sample_app 警告,并且测试已定义

    我正在尝试测试 Hartl 的sample app 这是我运行后收到的消息bundle exec rake test DEPRECATION WARNING The configuration option config serve sta
  • Lambdify 参数积分

    我有以下问题 我想要lambdify a sympy包含参数积分的表达式 例如Integral tanh a x x 0 1 我尝试进行手动实施像这儿 我们想要的本质上是将积分转换为如下形式 lambda theta quad lambda
  • 用于调整/校准启发式算法属性的软件

    今天看到有一个软件叫WinCalibra 向下滚动一点 它可以将具有属性的文本文件作为输入 然后 该程序可以根据算法的输出值优化输入属性 看这张纸或用户文档以获取更多信息 请参阅上面的链接 遗憾的是 doc 是一个压缩的 exe 您知道在
  • 使用 java 流将两个相同大小(和不同类型)的列表组合成域对象列表

    我有两个相同大小的列表ids and results我想用域对象创建新列表 List
  • IE9 + css:固定标头表的问题

    所以 我认为这是一个 CSS 问题 但基本上 我提供的 HTML 在反应式布局中包含一个固定的标头表 Code http jsfiddle net JpRQh 10 有3行数据 但在IE9中 表格行数似乎疯狂高 并且滚动条已被禁用 我在固定
  • 为什么 SQL 中没有“product()”聚合函数? [复制]

    这个问题在这里已经有答案了 当有 Sum min max avg count 函数时 有人可以帮助理解为什么没有 Product 内置函数 这个聚合函数最有效的用户实现是什么 谢谢 三位一体 如果您有可用的指数函数和对数函数 则 PRODU
  • 是否有一个函数可以检查字符串中的字符是否是字母表中的字母? (迅速)

    我正在将 python 程序转换为 swift 其中一个部分使用 for 循环来保留字符串中的每个字符 如果它是字母 在python中 就像使用 isalpha 一样简单 swift中有什么可以做到这一点吗 python 中的代码 word
  • PHP、PDO、MySQL,注意:尝试获取非对象的属性

    我仍在尝试围绕 php 进行思考 如果这是一个简单的错误 那么很抱歉 我已经搜索了很长一段时间 只能设法得到不同的错误 例如 未定义的索引 我试图做的是有一个函数可以从表中获取数据 目前它不包含很多数据 但最终将包含每个主网页的所有内容 它
  • NSParagraphStyle iOS - 如何检测块和列表?

    我有一个 NSParagraphStyle 对象 当使用 NSLog 检查时 它包含列表和块 但是似乎完全没有办法访问它们 我使用 OS X 创建文档并将其传输到 iOS 的文本视图中 其中列表和表格可以成功重新创建并显示在 NSLog 中
  • JavaScript 正则表达式原型

    为什么 Chrome 的控制台显示 对于 RegExp 的原型 console log RegExp prototype console log a proto 这是特定于实现的吗 IE 正在显示 这只是出于好奇而提出的问题 当我遇到这个问
  • 如何让 IBM DB2 提供程序与 Entity Framework 4.0 一起使用

    有人可以告诉我如何让 DB2 提供程序显示在 更改数据源 对话框窗口中吗 Steps 右键单击 edmx 设计图面 选择 从数据库更新模型 在更新向导中 单击 新连接 在 数据源 文本框旁边 单击 更改 在 更改数据源 窗口中 我仅在列表中
  • 没有主键可供引用的外键

    我有以下两张表 CREATE TABLE parent c1 INTEGER CREATE TABLE child c1 INTEGER c2 INTEGER c3 INTEGER CONSTRAINT fk c3 FOREIGN KEY
  • 读取VC++ CArchive二进制格式(或Java读取(CObArray))

    是否有关于用于序列化各种 MFC 数据结构的二进制格式的明确文档 我已经能够在十六进制编辑器中查看我自己的一些类 并使用 Java 的 ByteBuffer 类来读取它们 通过自动字节顺序转换等 然而 我目前在尝试引入 CObArray 数
  • OpenGL 离屏渲染

    我有一个应用程序 可以创建 3D 模型并从中导出图像 我用这个例子来做到这一点 include