gpt4 book ai didi

c++ - OpenGL 和 OOP 编程

转载 作者:太空宇宙 更新时间:2023-11-04 11:37:42 24 4
gpt4 key购买 nike

我想在类中构建我的 OpenGL 程序,起初,我想我会有 Mesh、Shader、Vertex、Face(表示)类。 Shader 是一个用于处理着色器操作(如创建、编译、链接、绑定(bind)、解除绑定(bind))的类。 Mesh 包含一个着色器、Vertex 列表和 Face 列表,它将创建缓冲区,使用附加的着色器将对象绘制到屏幕,因此所有对象(如 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);

任何人都可以建议我一种使用动态着色器或其他方法来绘制对象的方法吗?

最佳答案

根据评论组装:

通常网格只是一种几何体。 Material 是着色器(更笼统地说是效果)及其参数。还有像“场景对象”之类的东西——包含对网格(或其他对象类型)和 Material 的引用的虚拟节点实体。我非常怀疑网格应该自行绘制 - 这种方法缺乏灵 active ,而且意义不大。

我认为您应该使用“renderer”或“render_queue”之类的东西,它需要绘制对象(网格和 Material 束)并在某个时候绘制它们。它甚至允许您对渲染队列进行排序以最大限度地减少状态切换(切换着色器/着色器参数/纹理会产生性能成本)。

属性来自网格(也许使用一些标准名称会更容易,例如“position”、“normal”、“texcoord0”……)。至于制服——有不止一种方式。例如。你有一个 Material 文件,内容如下

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

然后你将这个文件加载到 Material 结构中,将它与效果(你称之为“着色器”)、纹理等链接起来。然后渲染器将它们放在一起并按名称设置属性和制服。

旁注:

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

关于c++ - OpenGL 和 OOP 编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22539270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com