c++ - 在软件渲染器中模仿顶点/片段着色器的设计模式是什么?

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

我有一个类似于 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 编译的东西都是如此。

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

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

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

最佳答案

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

关于c++ - 在软件渲染器中模仿顶点/片段着色器的设计模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25246539/

相关文章:

c++ - 从矩阵列中减去特征向量

c++ - Visual C++ x64 带进位加法

c++ - 为什么 typeid 总是返回 false?

c++ - 使用数组参数 C++ 定义模板类的成员函数

c++ - 优化掉未使用的参数化字段

c++ - 通过指针调用模板类成员函数【为什么这个有效的c++】?

java - OpenGL 版本在 ContextAttribs() 值更改时更改

c++ - 用于矩阵堆栈的 openGL

c++ - OpenGL-添加第二个着色器属性会导致黑屏

opengl - 是否还有 OpenGL 1.2 的教程?