glsl编译时分区const

时间:2012-05-03 15:49:54

标签: const glsl

这个GLSL代码是否会在“oneSixth”和“twoThirds”之外创建编译时常量?

// GLSL TESSELLATION EVALUATION SHADER
#version 410

layout (isolines, equal_spacing) in;
in vec4 tessColor[];
out vec4 pointColor;

const float oneSixth = 1. / 6.;
const float twoThirds = 2. / 3.;

void main ()
{
    float s2 = gl_TessCoord.s * gl_TessCoord.s;
    float s3 = s2 * gl_TessCoord.s;
    float w0 = oneSixth - .5 * gl_TessCoord.s + .5 * s2 - oneSixth * s3;
    float w1 = twoThirds - s2 + .5 * s3;
    float w2 = oneSixth + .5 * gl_TessCoord.s + .5 * s2 - .5 * s3;
    float w3 = oneSixth * s3;

    gl_Position = w0 * gl_in[0].gl_Position + w1 * gl_in[1].gl_Position +
            w2 * gl_in[2].gl_Position + w3 * gl_in[3].gl_Position;
    pointColor = w0 * tessColor[0] + w1 * tessColor[1] +
            w2 * tessColor[2] + w3 * tessColor[3];
}

我的一位同事认为这段代码效率低下,并说我应该对该部门进行硬编码,否则它将在运行时发生。

const float oneSixth = .1666666667;
const float twoThirds = .6666666667;

我是GLSL的新手,但我怀疑这是必要的。有什么想法吗?它是供应商依赖吗?

2 个答案:

答案 0 :(得分:3)

它将在编译时发生。不需要硬编码像这样的琐事。但是,GLSL规范中没有提到这一点。

答案 1 :(得分:1)

如果有疑问,请测量,但我会考虑在编译时没有执行此操作的任何实现。