【问题标题】:OpenGL and OOP programmingOpenGL 和 OOP 编程
【发布时间】:2014-04-27 16:04:45
【问题描述】:

我想在类中构建我的 OpenGL 程序,首先,我想我会有 Mesh、Shader、Vertex、Face(表示)类。 Shader 是一个用于处理着色器操作的类,如创建、编译、链接、绑定、取消绑定。 Mesh 包含一个着色器、顶点列表和面列表,它将创建缓冲区,使用附加着色器将对象绘制到屏幕上,因此所有对象(如 Box、Sphere、Monkey、TeaPot ......)都将从 Mesh 类(甚至直接使用Mesh类)。问题出在Mesh的绘制方法中:每个着色器都有不同的属性和统一变量,......我找不到用动态着色器绘制对象的方法。我的 OOP 模型不好吗?或者有什么方法可以做到这一点?

我只希望我的程序如下所示:

Vertex vertices[] = {....};
Face faces[] = {...}; // Indicates
Shader color_shader = ColorShader::getOne();
Mesh box;
box.pushVertices(vertices);
box.pushFaces(faces);
box.shader = color_shader;
box.buildObject();

在这样的渲染方法中:

box.draw(MVP);

谁能建议我一种使用动态着色器或其他方法来绘制对象的方法?

【问题讨论】:

  • 看看 3D 编辑器。它们通常有单独的“材质”,甚至可能有“效果”——有很多参数,可以作为着色器的输入。
  • 我只想做三个js库:threejs.org/examples/webgl_materials.html,他们向网格添加材料,但我不熟悉 js 来阅读它的源代码:-(
  • 传统上,网格只是一个几何体。材质是一个着色器(更一般地 - 效果)及其参数。还有类似“场景对象”的东西 - 包含对网格(或其他对象类型)和材质的引用的虚拟节点实体。我非常怀疑网格应该自行绘制 - 这种方法缺乏灵活性,而且没有多大意义。
  • 感谢您的建议。那么请告诉我应该如何重组我的程序?
  • 我以为我只是这样做了.. 能否请您更具体一些,我不明白您的问题?我认为您应该使用诸如“renderer”或“render_queue”之类的东西或其他任何名称,它们需要绘制对象(网格和材料的捆绑)并在某个时候绘制它们。它甚至允许您对渲染队列进行排序以最小化状态切换(切换着色器/着色器参数/纹理有性能成本)[并不是说它是唯一的方法,也不是最好的方法。但看起来相当适合教育目的]

标签: c++ oop opengl


【解决方案1】:

由 cmets 组装而成:

传统上,网格只是一个几何图形。材质是一个着色器(更一般地 - 效果)及其参数。还有类似“场景对象”的东西 - 包含对网格(或其他对象类型)和材质的引用的虚拟节点实体。我非常怀疑网格应该自行绘制 - 这种方法缺乏灵活性,而且没有多大意义。

我认为您应该使用类似“renderer”或“render_queue”或其他任何名称的东西,它需要绘制对象(网格和材料的捆绑)并在某个时候绘制它们。它甚至可以让您对渲染队列进行排序以最小化状态切换(切换着色器/着色器参数/纹理有性能成本)。

属性来自网格(也许使用一些标准名称会更容易,例如“位置”、“正常”、“texcoord0”……)。至于制服 - 有不止一种方法。例如。你有一个包含如下内容的材料文件

use_effect phong_single_texture;
texture t0 = "path_to_texture";
vec3 diffuse_colour = { 1, 0, 0 };

然后将此文件加载到材质结构中,将其与效果(您称为“着色器”)、纹理等链接。然后渲染器将所有这些拉到一起并按名称设置属性和制服。

旁注

如果您以高性能为目标,那么无处不在的 OOP 并不是很好,但它对教育目的很有用。只要您的经验足够好 - 谷歌搜索“面向数据的设计”之类的东西,但这不是一个简单的话题。

【讨论】:

  • 非常感谢! ;)
猜你喜欢
  • 2010-09-27
  • 2021-05-28
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 2019-11-02
  • 2012-03-30
相关资源
最近更新 更多