Opengl es 什么时候我应该停止使GLSL-ES着色器复杂化,并开始将它们拆分为更小、更简单的着色器?

Opengl es 什么时候我应该停止使GLSL-ES着色器复杂化,并开始将它们拆分为更小、更简单的着色器?,opengl-es,glsl,shader,Opengl Es,Glsl,Shader,我在寻找本主题中的信息时遇到了问题,当简单地切换程序而不是使用大型复杂的着色器更有效时 有人告诉我,即使是一个简单的IF语句也可能是预先计算该条件并据此选择程序的原因 这本书或“GLSL-ES中的良好实践”的书/教程有什么帮助吗?这几乎取决于你的意思 着色器程序中的分支会影响GPU的性能:如果顶点数组很长,我会避免分支;而是使用预处理器并链接多个不同的程序 使用单个复杂的大型着色器程序可以提高CPU性能:每个glUseProgram都需要时间,您可能只需要调用一次(至少更少) CPU的优势是否大

我在寻找本主题中的信息时遇到了问题,当简单地切换程序而不是使用大型复杂的着色器更有效时

有人告诉我,即使是一个简单的IF语句也可能是预先计算该条件并据此选择程序的原因


这本书或“GLSL-ES中的良好实践”的书/教程有什么帮助吗?

这几乎取决于你的意思

着色器程序中的分支会影响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
}
#包括
#包括
#包括
#包括
//---顶点着色器输出
//此着色器输出接口
开始输出块(碎片着色器)
//加工顶点颜色
vec4-ds_颜色;
//处理顶点纹理坐标
结束输出块()
//顶点着色器入口点
void main()
{
//计算变换的顶点位置
gl_位置=项目垂直展示(ds_垂直展示);
#如果已定义(每个顶点的颜色)
//支持顶点颜色
ds_Color=ComputeVertexColor();
#恩迪夫
//支持顶点纹理
#如果已定义(DS_纹理)
ds_TexCoords=ds_vertextextcoord;
#恩迪夫
}