【问题标题】:GLSL Passing Additional Light Positions in As Uniform Variables to Vertex ShaderGLSL 将额外的光位置作为统一变量传递给顶点着色器
【发布时间】:2015-03-28 05:50:19
【问题描述】:

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

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

...
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 的屏幕截图:

使用统一 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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我已将其移至片段着色器中,结果相同。在构建框架时,我做了更多的挖掘工作。请参阅更新以发布更多信息。
    • 检查glGetUniformLocation 不返回-1。
    • 在这种情况下,制服将是 vec3(0.0, 0.0, 0.0),这也可以解释结果。
    • 问题是在设置uniform时shader没有绑定。我做得太高了。
    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多