最佳实践:多次使用相同的着色器
Posted
技术标签:
【中文标题】最佳实践:多次使用相同的着色器【英文标题】:Best practice: Mutiple usage of same shader 【发布时间】:2015-07-27 15:14:23 【问题描述】:我想知道多次重复使用同一个着色器的最佳方法是什么。 我有使用相同着色器的不同对象。是否可以再次为每个对象编译和链接相同的着色器,还是只编译/链接一次更好?
问题是:OpenGL 会缓存已编译的着色器还是会再次编译?
那么链接呢:我应该为不同的对象多次使用一个程序,还是用相同的着色器重新编译多个程序也可以?
/** Option 1: Using same equal shaders multiple times **/
int vertexShader1 = loadShader(GL_VERTEX_SHADER, vertexShaderCode);
int vertexShader2 = loadShader(GL_VERTEX_SHADER, vertexShaderCode);
int vertexShader3 = loadShader(GL_VERTEX_SHADER, vertexShaderCode);
int program1 = glCreateProgram();
int program2 = glCreateProgram();
int program3 = glCreateProgram();
glAttachShader(program1, vertexShader1);
glAttachShader(program2, vertexShader2);
glAttachShader(program3, vertexShader3);
glLinkProgram(program1);
glLinkProgram(program2);
glLinkProgram(program3);
/** Option 2: Using same shader multiple times **/
int vertexShader = loadShader(GL_VERTEX_SHADER, vertexShaderCode);
int program1 = glCreateProgram();
int program2 = glCreateProgram();
int program3 = glCreateProgram();
glAttachShader(program1, vertexShader);
glAttachShader(program2, vertexShader);
glAttachShader(program3, vertexShader);
glLinkProgram(program1);
glLinkProgram(program2);
glLinkProgram(program3);
/** Option 3: Reuse program **/
int vertexShader = loadShader(GL_VERTEX_SHADER, vertexShaderCode);
int program = glCreateProgram();
glAttachShader(program, vertexShader);
glLinkProgram(program);
【问题讨论】:
如果您有一个着色器,请不要多次复制它。它与其他所有资源相同,例如纹理或网格。复制只是浪费内存和计算能力。 【参考方案1】:如果有疑问:尽量减少对象的数量并重复使用。切换着色器是 OpenGL 中成本更高的操作,依赖驱动程序进行重复数据删除是不好的做法。
【讨论】:
以上是关于最佳实践:多次使用相同的着色器的主要内容,如果未能解决你的问题,请参考以下文章