如果只是简单地切换程序而不是使用大而复杂的着色器,我在查找本主题中的信息时遇到了麻烦?
有人告诉我,即使是简单的IF声明也可能是预先计算该条件并相应选择程序的理由。
我可以阅读这个或任何“GLSL-ES中的良好实践”一书/教程的任何帮助吗?
答案 0 :(得分:2)
这几乎取决于你的意思。
着色器程序中的分支会影响GPU术语的性能:如果你的顶点数组非常长,我会避免分支;而是使用预处理器并链接多个不同的程序。
使用单复杂的大型着色器程序可提高CPU性能:每个 glUseProgram 需要时间,您可能只需要调用一次(至少更少)。
CPU优势是否优于GPU优势?回答这个问题可以回答你的问题。
...
就个人而言,我选择了预处理器,并且为了基本目的而避免分支。每个着色器程序都有明确定义的接口,不同的对象实现它们;附加不同的对象完成程序实现。
实现#include指令有很大帮助。通用声明包含在不同的对象中,只有静态访问的属性和制服才能有效地链接到程序中。
这是我的着色器程序的一个例子:
#include </Derm/Shaders/IProjectVertex>
#include </Derm/Shaders/Compatibility>
#include </Derm/Shaders/Standard/ShaderInputs>
#include </Derm/Shaders/Standard/IColorVertex>
// --- Vertex shader outputs
// This shader output interface
BEGIN_OUTPUT_BLOCK(FragmentShaderVaryings)
// Processed vertex color
vec4 ds_Color;
// Processed vertex texture coordinate
END_OUTPUT_BLOCK()
// Vertex shader entry point
void main()
{
// Compute transformed vertex position
gl_Position = ProjectVertexPosition(ds_VertexPosition);
#if defined(DS_COLOR_PER_VERTEX)
// Support vertex color
ds_Color = ComputeVertexColor();
#endif
// Support vertex texturing
#if defined(DS_TEXTURE)
ds_TexCoords = ds_VertexTexCoord;
#endif
}