对于Qt阵列,GLSL均匀性始终为零



我正在使用Qt。我有多个着色器在工作,但是传递统一数组似乎总是将所有设置为零。预期的结果是在纹理顶部绘制随机圆圈(或者由于圆圈太多而只是透明纹理)。我得到的是右下角的单个粒子圆圈。

if (program->isLinked()) {
    QVector3D hitPoints[40];
    for (int k = 0; k < 40; k++) {
        hitPoints[k] = QVector3D((float)rand()/(float)RAND_MAX, (float)rand()/(float)RAND_MAX, (float)rand()/(float)RAND_MAX);
    }
    program->setUniformValueArray("hitPoints", hitPoints, 40);
    program->bind();
}

片段着色器:

uniform sampler2D color_texture;
uniform vec3 hitPoints[40];

void main()
{
    float dist = 0.3;
   vec2 texcoord = vec2(gl_TexCoord[0]);
   for (int i = 0; i < 40; i++) {
       float close = sqrt(pow(hitPoints[i].y - texcoord.y, 2) + pow(hitPoints[i].x - texcoord.x, 2));
       if (close < dist) {
            gl_FragColor = vec4(0,0,0,texture2D(color_texture, texcoord).a);
            return;
       } 
   }
   gl_FragColor = texture2D(color_texture, texcoord);
}

当使用普通的OpenGL(没有Qt)时,对glUniform的调用只有在相应的程序处于活动状态(使用glUseProgram)时才有效。由于QGLShaderProgramsetUniformbind函数应该分别是围绕glUniformglUseProgram的简单包装器,因此您应该将函数调用的顺序更改为:

program->bind();
program->setUniformValueArray("hitPoints", hitPoints, 40);

因此,当程序绑定时,始终设置程序的统一。但另一方面,制服的值在程序的绑定和取消绑定上是持久的,因此如果它们没有更改,则不必在每次绑定程序时都设置它们。

遗憾的是,文档没有说明此问题。但是由于它命名了由相应的Qt函数包装的GL函数,我想他们只是假设任何弄乱OpenGL的人都知道这些事实(实际上它们只是轻量级包装器,本身没有新的接口)。

最新更新