最佳实践:多次使用相同的着色器

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 中成本更高的操作,依赖驱动程序进行重复数据删除是不好的做法。

【讨论】:

以上是关于最佳实践:多次使用相同的着色器的主要内容,如果未能解决你的问题,请参考以下文章

来自 Vue 中不同组件的多个请求 - 最佳实践

记录器包装器最佳实践

在多个项目中使用相同模型的最佳实践是啥?

使用具有不同结构的相同函数的最佳实践 - Golang

MySQL性能优化的21个最佳实践

在查询组件之外显示 Apollo 客户端查询加载的最佳实践?