GLSL将As均匀变量中的附加光位置传递给顶点着色器

时间:2015-03-27 05:16:45

标签: c++ qt opengl-es glsl lighting

假设您想要将额外的光线位置传递到顶点着色器(在固定功能管道提供的灯光之外),我没有看到这些额外的制服正常工作。

例如,在我的顶点着色器中,我有:

...
uniform vec3 light_pos;

...
varying vec3 frag_light_pos;

void main() {
    ...

    frag_light_pos = vec3(0.0f, 100.0f, 0.0f);
    //frag_light_pos = light_pos;

    ...
}

我的场景中的差异可以在下面看到。

要设置统一变量,我将按以下方式使用Qt' QOpenGLShaderProgam::setUniformValue

QVector3D light_pos(0.0f, 100.0f, 0.0f);
m_ShaderProgram->setUniformValue("light_pos", light_pos);

我所有的其他制服,mv,mvp和(trans(mv))^ - 1都有效,所以Qt不是问题。我哪里错了?我期望使用任一版本看到相同的图像。

使用const vec3的截图: const vec3

使用统一vec3的屏幕截图: uniform vec3


更新

我在代码中每次调用OpenGL后都添加了glGetError,它由一个函数组成。当我使用或不使用Qt的API来设置制服时,我只会出现错误,如下所示:

/*
    QVector3D light_pos(0.0f, 100.0f, 0.0f);
    m_ShaderProgram->setUniformValue("frag_light_pos", light_pos); GL_CALL
/*/
    GLint light_id = glGetUniformLocation(m_ShaderProgram->programId(),
        "frag_light_pos"); GL_CALL
    glUniform3f(light_id, 10.0f, 10.0f, 10.0f); GL_CALL
//*/

GL_CALL定义为:

#define GL_CALL GetGlErrors(__LINE__);

void GetGlErrors(int line)
{
    GLenum err_code;
    while ((err_code = glGetError()) != GL_NO_ERROR) {
#if __GL_WRAPPER_WINDOWS__
        char buffer[256];
        sprintf_s(buffer, "GL_ERROR is %d from %d\n", err_code, line);
        OutputDebugStringA(buffer);
#else
        printf("GL_ERROR is %d from %d\n", err_code, line);
#endif
    }
}

我程序的输出显示给定错误的行:

  

GL_ERROR从263起是1282

1 个答案:

答案 0 :(得分:0)

由于可以在顶点着色器和片段着色器中访问制服,因此没有理由将其传递通过顶点着色器。只需将统一声明移动到片段着色器并直接在那里使用。

您得到的结果可能是由于光栅化器中变量变量的插值,这意味着frag_light_pos将为每个像素(片段)赋予不同的值。有可能使用带flat限定符的变量来“关闭”插值,但我看不出你为什么会这样做的原因。