【问题标题】:What design pattern to mimic vertex/fragment shaders in a software renderer?在软件渲染器中模拟顶点/片段着色器的设计模式是什么?
【发布时间】:2016-04-29 13:30:51
【问题描述】:

我有一个设计类似于 OpenGL 2.0+ 渲染管道的软件渲染器,但是,我的软件渲染器在功能上是相当静态的。我想设计它,以便我可以放入自定义顶点和片段“着色器”(编写为 C++“函数”,而不是使用 OpenGL 语言),但是,我不确定如何实现一个好的、可重用的、可扩展的解决方案。

基本上,我想在一个自定义“函数”之间进行选择,然后在我的渲染器中调用它来处理每个顶点(或片段)。所以也许我可以使用传递给渲染器的函数对象,或者制定一些基于继承的解决方案,或者我认为这可能是基于模板的解决方案的情况。

我想是这样的:

for every vertex
  // call the vertex-shading function given by the user, with the standard
  // arguments plus the custom ones given in user code. May produce some custom
  // output that has to be fed into the fragment shader below
end
// do some generic rendering-stuff like clipping etc.
for every triangle
  for every pixel in the triangle        
    // call the fragment-shading function given by the user, with the standard
    // arguments, plus the custom ones from the vertex shader and the ones 
    // given in user code
  end
end

我可以很好地编写 C++,但是我没有太多关于模板和更高级的东西的实践经验 - 虽然我已经阅读了很多并观看了很多视频。

有一些要求,比如其中一个“着色器函数”可以有多个(不同的)输入和输出变量。有 2-3 个参数不是可选的并且总是相同的(比如顶点着色器的输入显然是三角形,输出是变换后的位置),但是一个着色器可以例如还需要额外的权重参数或重心坐标作为输入。此外,应该可以将顶点着色器的此类自定义输出之一馈送到相应的片段着色器中(就像在 OpenGL 中,顶点着色器中的变量的输出被馈送到片段着色器中)。

同时,我也更喜欢一个简单的解决方案——它不应该太高级(比如我不想模仿 GLSL 编译器,或者有自己的 DSL)。它应该类似于 - 编写 VertexShaderA 和 VertexShaderB 并能够将它们都插入到我的渲染器中,以及一些取决于着色器的参数。

我希望解决方案使用“现代”C++,就像使用 VS2013 和 gcc-4.8 编译的所有内容一样。

所以重新表述我的主要问题:

如何使用提到的附加功能来完成这种“将自定义函数传递给我的渲染器”?

如果可能,我会欢迎一些示例代码来帮助我入门。

【问题讨论】:

  • 听起来你想要std::function,不是吗?
  • @ChristianHackl 好吧,这将是一个开始,但是 1)我传递的函数无法访问渲染器类的成员? 2)我该如何处理“将参数从顶点着色器传递到片段着色器”?

标签: c++ templates opengl design-patterns c++11


【解决方案1】:

TinyRenderer 是一个非常简单但相当优雅的实现,大约有 500 行代码,它有一些带有教程的 wiki。查看https://github.com/ssloy/tinyrenderer 和实际着色器https://github.com/ssloy/tinyrenderer/blob/master/main.cpp

【讨论】:

    猜你喜欢
    • 2012-08-14
    • 2019-07-31
    • 2019-01-24
    • 2019-05-20
    • 2014-02-16
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多