OpenGL";“优化”;均匀变量

OpenGL";“优化”;均匀变量,opengl,optimization,3d,glsl,unroll,Opengl,Optimization,3d,Glsl,Unroll,我有一个统一的变量,名为control\u count(贝塞尔曲线中控制点的计数)。在代码中的标记部分,如果我用这个变量替换常量4,它就停止工作,如果它是4,它工作正常。变量中必须有值4,我在循环前后也测试了它,我在代码中也标记了这个。这应该是一个展开问题吗?如何强制编译器不执行此操作 #version 150 layout(lines_adjacency) in; layout(line_strip, max_vertices = 101) out; out vec4 gs_out_c

我有一个统一的变量,名为control\u count(贝塞尔曲线中控制点的计数)。在代码中的标记部分,如果我用这个变量替换常量4,它就停止工作,如果它是4,它工作正常。变量中必须有值4,我在循环前后也测试了它,我在代码中也标记了这个。这应该是一个展开问题吗?如何强制编译器不执行此操作

#version 150


layout(lines_adjacency) in;

layout(line_strip, max_vertices = 101) out;

out vec4 gs_out_col; 

uniform mat4 MVP;
uniform int control_count;
uniform int tess_count;

int degree;

int binom( int n, int k );

void main() 
{

degree = control_count - 1;

vec3 b[10];
float B[10];

////////////MARK//////////////////
//control_count must be 4, other ways it'd draw less points
for(int i = 0; i < control_count; ++i){
    b[i] = gl_in[i].gl_Position.xyz;
}
////////////END MARK//////////////////

for(int i = 0; i <= tess_count; ++i){
    float t = i / float(tess_count);

    gl_Position = vec4(0);

    ////////////MARK//////////////////
    //here, if I write control_count instead of 4, I don't get what I expect
    for(int j = 0; j < 4; ++j){         
    ////////////END MARK//////////////////
        B[j] = binom(3, j) * pow(1 - t, 3 - j) * pow(t, j);
        gl_Position += vec4(b[j] * B[j], B[j]);
    }

    gl_Position = MVP * gl_Position;

    ////////////MARK//////////////////
    //control_count - 4 --> I get red color,
    //control_count - 3 --> I get purple, 
    //so the variable must have the value 4
    gs_out_col = vec4(1, 0, control_count - 4, 1);//gl_Position;
    ////////////END MARK//////////////////

    EmitVertex();
}
#版本150
中的布局(线与相邻);
布局(线带,最大顶点=101)输出;
输出向量4 g\u out\u col;
均匀mat4-MVP;
统一整数控制计数;
均匀整数tess_计数;
智力度;
int-binom(int-n,int-k);
void main()
{
度=控制计数-1;
vec3b[10];
浮动B[10];
////////////标记//////////////////
//控制计数必须是4,否则它会得到更少的点数
对于(int i=0;i对于(int i=0;i实际上,当您不知道编译时的迭代次数时,展开循环没有多大好处(就像GLSL编译器在使用统一流控制时的情况)。不,这里的实际问题是[…]中的
gl_的大小
当输入原语为“线邻接”时;4.假设我正确理解了您的问题…真正的问题是您正在使用几何体着色器进行细分,这是低效的,因为GPU无法轻松地将其并行化。使用OpenGL 4+细分阶段可获得更好的性能。@ColonethirtyTwo:祝您好运在OpenGL 3.2(GLSL 1.50);)中,这可能是因为对gl_in的读取超出了范围。还有什么是“不工作”的意思。编译失败?链接失败?gl错误?只是没有渲染?对不起,我应该更准确一些,我更新了我的帖子,结果是“好”和“错”