面向对象架构基于着色渲染游戏

我一直在建立游戏引擎在我的课要看起来像这样打的时候这个问题:

interface Entity { draw(); } class World { draw() { for (e in entities) e.draw(); } }

这只是伪代码,以显示绘图大致是如何发生的。 每个实体子类实现自己的图纸。 世界遍历没有特定的顺序所有实体,并告诉他们一个吸引自己的。

但基于着色器的图形,这往往是效率极其低下,甚至不可行。 每个实体类型很可能将具有其自己的着色器程序。 为了最大限度地减少程序的变化,需要被拉到一起的每个特定类型的所有实体。 简单类型的实体,如颗粒,可能还需要汇总自己的图形中的其他方面,例如分享一个大的顶点数组。 和它获取与混合和这样的地方一些实体类型需要在相对于其他人,或者甚至在多次不同的通行证某些时候要呈现真毛。

我通常与最终是某种渲染单为保持所有实例的列表,并立刻吸引他们都为每个实体类的。 既然它从游戏逻辑绘图分离不是那么糟糕。 但是渲染器需要找出实体绘制的哪个子集,它需要访问图形管线的多个不同部分。 这是我的对象模型往往会导致混乱,有很多重复的代码,紧密耦合,以及其他坏事。

所以我的问题是:什么是一个很好的架构,这种游戏绘图即高效,多功能,模块化?

--------------解决方案-------------

使用两阶段的方法:首先遍历所有的实体,但不是图纸让他们插入到自理引用成(中)绘图批次清单。 然后排序OpenGL的状态和着色器使用的名单; 在每一个州transistion排序插入状态转换对象后。

通过执行列表中引用的每个对象的绘制例程列表最后迭代。

这不是一个容易回答的问题,因为有许多方法来处理这​​个问题。 一个好主意是寻找到一些游戏/渲染引擎,看看这是如何处理那里。 一个好的起点是食人魔,因为它的有据可查和开源。

据我所知,通过从材料部件(着色器),顶点数据分离内置材料的脚本。 渲染器本身知道网是什么样的顺序以怎样的着色器(和它​​的通行证),以绘制。

我知道这个答案有点模糊,但我希望我可以给你一个有用的提示。

分类:接力 时间:2012-01-01 人气:0
分享到:

相关文章

  • 在片段着色器OpenGL的点精灵旋转 2012-08-08

    我下面这个教程学习的东西更多关于OpenGL和在特定点精灵. 但我被困在在页面末尾的一个练习: 尝试通过改变片段着色器旋转点精灵45度. 没有关于这类事情的一章中的提示,也没有在以前的. 我没有找到如何做的文档. 这是我的顶点和片段着色器: 顶点着色器 #version 140 attribute vec2 coord2d; varying vec4 f_color; uniform float offset_x; uniform float scale_x; uniform float poi

  • 的DirectX 10.0或11.0顶点或绘制比其他像素着色器()显卡​​驱动程序内调用API的使用 2013-04-11

    我们的项目是要分析的各个顶点和像素,在DirectX 10或11 SDK应用程序或游戏(生化奇兵,孤岛惊魂等)应用中的几何着色器. 现在,我们需要时正在使用的着色器(VS,GS,PS)或管道内,而执行的技术理解,我们知道,在抽奖()的DirectX API调用,管道内执行设置着色器获取的. 是否有任何其他API而不是拉伸()调用,它可以在内部执行或使用SetShader利用着色器被设置在管道()? 是设备的API(如地图,取消映射,getResourcem和复制资源)操纵着色器间接? 相关于Di

  • 在FRAG着色器OpenGL的显色指数? 2014-06-24

    我有一个大的精灵库,我想削减GPU内存要求. 我可以存储在GPU上的纹理与每个像素只1个字节,并使用了RGB颜色查找在片段着色器? 我看到在使用GL_R8相互矛盾的报告. --------------解决方案------------- 我会说这真的取决于你的硬件是否支持纹理格式与否. 如何使用跳过整个问题A8R8G8B8质感呢? 使用位掩码它只是被压缩,即(或R / G / B / GLSL中的一个成员)改为"子像素"的价值观. 像第一像素被存储在alpha通道,在红色通道第二像素,在

  • 什么是顶点和像素着色器? 2013-12-18

    什么是顶点和像素着色器? 它们之间的区别是什么? 哪一个是最好的? --------------解决方案------------- 像素着色器是一个GPU(图形处理单元),可以通过编程来对每个像素的基础上运作和照顾的东西,如照明和凹凸映射组件. 顶点着色器也是GPU组成部分,并使用特定的汇编语言一样,像像素着色器也被编程,而是面向现场的几何形状,并且可以做的事情,如添加卡通轮廓边缘对象等. 既不是优于其他,它们各自具有它们的具体用途. 大多数现代的显卡支持DirectX 9或更高版本包含这些功能

  • 对于固定Nvidia和AMD GLSL着色器 2014-08-21

    我有让我GLSL着色器两个AMD和NVIDIA的硬件合作问题. 我不寻求帮助修复一个特定的着色器,但如何尽量避免使用让这些问题. 是否有可能来检查,如果着色器编译基于AMD / NVIDIA驱动程序,而与相应的硬件上运行的一台机器上的应用程序,并借势呢? 我知道,到了最后,测试是可以肯定的唯一方式,但在开发过程中,我想至少避免了明显的问题. 使用GLSL每个人都必须有这些问题,所以为什么我不能找到一个好办法来解决呢? --------------解决方案------------- 是否有可能来检

  • 如何获得由片段着色器中产生的像素/片段的列表? 2012-05-06

    片段着色器提请帧缓冲. 但是,我怎么能有效地获得,就像片段着色器执行的结果所产生的像素/片段? --------------解决方案------------- 设置一个模板掩模所以每次你画一个片段时,它会将该掩码设置成1. 检索模板掩模和glReadPixels功能颜色缓冲区. 在一般情况下,你不知道. 你可以有片段着色器写入特定颜色值的图像. 然后,你可以阅读从图像背部和测试,其中颜色是. 这将得到你想要的信息. 如果你写一个浮点帧缓冲,你甚至可以使用的添加剂混合模式,这样你可以看到你是多么写

  • 显卡的OpenGL着色器的发展 2013-11-18

    我需要一些硬件的使用GLSL高带宽的视频处理. 任何人都可以推荐我适合这份工作的最佳GPU? 我的要求(最到最不重要): 适合笔记本电脑 良好的片段着色器的支持(高指令限制等) 像素缓冲对象扩展 优质的OpenGL windows驱动程序 低价 :) --------------解决方案------------- 适合笔记本电脑:遗憾的是改变笔记本电脑的GPU是非常罕见的,如果不是闻所未闻 质量OpenGL驱动程序(在Windows / Linux的):nVidia的往往不在乎超过ATI一下吧

  • OpenGL的:“片段着色器不支持HW”老ATI显卡 2013-03-22

    在我们的OpenGL游戏中,我们已经得到了ATI RADEON X800卡上的着色器链接失败. glGetProgramInfoLog报道: Fragment shader(s) failed to link, vertex shader(s) linked. Fragment Shader not supported by HW 一些谷歌搜索表明,我们可能会触及ALU指令的限制,由于很长的片段着色器. 任何方法来验证? 我没能找到的X800,也没有任何办法在运行时查询指令限制的详细规格. 即使

  • 与片段着色器的OpenGL drawPixels 2012-09-01

    我很困惑的OpenGL的管道. 我有一个openGL的方法,其中我试图使用glDrawPixels一个片段着色器,所以我的代码如下所示: // I setup the shader before this glUseProgram(myshader); glDrawPixels(...); 在某些显卡着色器被应用,但对别人没有. 我没有问题,NVIDIA,但不同的ATI显卡的问题. 这是与ATI显卡的错误吗? 或者是NVIDIA只是更加灵活,我误解管道? 是否有替代解决这个(除了纹理映射等)的工

  • 是否OpenGL ES的支持环境着色器? 2014-03-25

    我想打,似乎是反射金属3D对象. 我想用一个使用任何一个球体或立方体贴图,我可以指定为"反射"源的图像或纹理的环境着色器来完成. 是否OpenGL ES的iPhone上支持这个在任何版本? --------------解决方案------------- OpenGL ES 2.0的着色器提供支持. 然而,这不是在当今市场上许多移动设备可用. 为你的代码既ES 1.1和ES 2.0版本的显卡,这将是非常重要的. 苹果开发中心拥有吨的转变信息: 的OpenGL ES 1.1的固定功能管线提

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.560 (s). 10 q(s)