【发布时间】: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”之类的东西或其他任何名称,它们需要绘制对象(网格和材料的捆绑)并在某个时候绘制它们。它甚至允许您对渲染队列进行排序以最小化状态切换(切换着色器/着色器参数/纹理有性能成本)[并不是说它是唯一的方法,也不是最好的方法。但看起来相当适合教育目的]