繁体   English   中英

OpenGL和OOP编程

[英]OpenGL and OOP programming

我想在类中构建OpenGL程序,首先,我想将拥有Mesh,Shader,Vertex,Face(表示)类。 Shader是用于处理着色器操作(如创建,编译,链接,绑定,解除绑定)的类。 Mesh包含一个着色器,一个Vertex列表和一个Face列表,它将创建缓冲区,使用附加的着色器将对象绘制到屏幕上,因此所有对象(如Box,Sphere,Monkey,TeaPot等)都将从Mesh类(甚至直接使用Mesh类)。 问题出在Mesh的draw方法中:每个着色器都有不同的属性和统一变量,...我找不到用动态着色器绘制对象的方法。 我的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();

在这样的render方法中:

box.draw(MVP);

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

由评论组装而成:

传统上,网格仅仅是几何。 材质是一个着色器(通常是效果)及其参数。 还有类似“ sceneobject”的东西-虚拟节点实体,其中包含对网格(或其他对象类型)和材质的引用。 我非常怀疑网格是否应该自己绘制-这种方法缺乏灵活性,并且没有太大意义。

我认为您应该使用诸如“ renderer”或“ render_queue”之类的东西,或诸如此类的东西,它需要绘制对象(网格和材料束)并在某些时候绘制它们。 它甚至可以让您对渲染队列进行排序,以最大程度地减少状态切换(切换着色器/着色器参数/纹理会降低性能)。

属性来自网格(使用“ position”,“ normal”,“ texcoord0”等一些标准名称可能会更容易)。 至于制服-有多种方法。 例如,您有一个内容如下的材料文件

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

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

旁注

如果您追求高性能,那么到处的OOP都不是很好,但是对于教育目的却是好的。 只要您的经验足够好-google之类的“面向数据的设计”之类的东西,都不是容易的话题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM