【发布时间】:2012-03-18 01:00:20
【问题描述】:
我刚刚学习 OpenGL,我意识到对于更复杂的着色器效果,基本上有两种策略可以用来实现它们。首先是编写一个复杂的顶点和片段着色器,它接受来自主程序的许多不同的统一变量,并决定在着色器中做什么。前任。如果我想将一个上下文中的像素设为蓝色,而将另一个上下文中的像素设为绿色,我可能会在 GLSL 中进行:
uniform int whichColor;
int main() {
if (whichColor == 1) {
gl_FragColor = vec4(0,1.0,0,1.0);
}
else {
gl_FragColor = vec4(0,0,1.0,1.0);
}
}
并在我的 C++ 绘图循环中将不同的整数传递给 whichColor。或者,我可以只定义两个单独的着色器程序,其中一个将 gl_FragColor 设置为蓝色,另一个设置为绿色,当我需要在我的 OpenGL 场景中绘制特定对象时,只需加载一个或另一个。
不过,我似乎找不到任何有关这些策略中哪一种更好的信息。我可能期望第一个策略,将要在显卡上渲染的所有复杂性放在更高的性能,但在某些情况下,我正在考虑决定绘制什么不是逐像素计算,并且不不能从并行化中受益。我不太了解着色器程序是如何在显卡上运行的,以及链接和传递变量的成本是多少,所以我不确定我的直觉在这里是否正确。
【问题讨论】:
-
“更好”是一个主观问题。它无法回答,因此在 SO 上不欢迎询问哪个“更好”的问题。至少,给它一些标准。以何种方式“更好”?
-
“更好”是指“通常更快”或者“需要在系统和 gfx 卡内存之间传输最少的数据”或“更接近专业 OpenGL 开发人员实际所做的”。与编写一个非常复杂的着色器并不断通过制服向其传递数据的成本相比,在 glut 显示函数中多次加载新着色器的成本是多少?