【问题标题】:How to update a uniform variable in GLSL如何更新 GLSL 中的统一变量
【发布时间】:2011-01-31 15:01:03
【问题描述】:

我正在尝试从我的应用程序更新我的着色器中的眼睛位置,但是当我尝试执行此操作时,我不断收到错误 1281。初始化后我没有问题,就在我随后尝试更新值时。这是我的代码:

void GraphicsObject::SendShadersDDS(char vertFile [], char fragFile [], 字符文件名 []) {

            char *vs = NULL,*fs = NULL;

            vert = glCreateShader(GL_VERTEX_SHADER);
            frag = glCreateShader(GL_FRAGMENT_SHADER);

            vs = textFileRead(vertFile);
            fs = textFileRead(fragFile);
            const char * ff = fs;
            const char * vv = vs;

            glShaderSource(vert, 1, &vv, NULL);
            glShaderSource(frag, 1, &ff, NULL);

            free(vs); free(fs);

            glCompileShader(vert);
            glCompileShader(frag);

            program = glCreateProgram();
            glAttachShader(program, frag);
            glAttachShader(program, vert);

            glLinkProgram(program);
            glUseProgram(program);

        LoadCubeTexture(filename, compressedTexture);

        GLint location = glGetUniformLocation(program, "tex");
        glUniform1i(location, 0);
        glActiveTexture(GL_TEXTURE0);

        EyePos = glGetUniformLocation(program, "EyePosition");

        glUniform4f(EyePos, EyePosition.X(),EyePosition.Y(), 
                                    EyePosition.Z(), 1.0);          
        DWORD bob = glGetError();
        //All is fine here
        glEnable(GL_DEPTH_TEST);

}

这是我调用来更新眼睛位置的函数:

void GraphicsObject::UpdateEyePosition(Vector3d& eyePosition){

glUniform4f(EyePos, eyePosition.X(),eyePosition.Y(), 
                                    eyePosition.Z(), 1.0);

DWORD bob = glGetError();
//bob equals 1281 after this call       

}

我现在尝试了几种更新变量的方法,这是最新的化身,感谢观看,欢迎所有 cmets。

更新:错误实际上并没有发生在这里,我的错是假设它是,当我绘制一些弹簧时错误实际上发生了:

for(int i = 0; i

        springs[i].Draw();

}

当我绘制第一个时它很好,但是在调用 glEnd() 以响应 glBegin(GL_LINE_STRIP) 的位置调用第二个时出现错误。很抱歉给您带来不便,因为这不是我发布的错误,但至少如果有人想知道如何更新统一变量,那么它就在这里。

【问题讨论】:

    标签: c++ opengl glsl


    【解决方案1】:

    这很可能是因为 EyePos 无效。

    如果将函数更改为以下内容会发生什么?

    void GraphicsObject::UpdateEyePosition(Vector3d& eyePosition)
    {
        EyePos = glGetUniformLocation(program, "EyePosition");
        glUniform4f(EyePos, eyePosition.X(),eyePosition.Y(), eyePosition.Z(), 1.0);
    
        DWORD bob = glGetError();
    }
    

    编辑:为响应您的更新,glBegin/glEnd 的文档说如果模式设置为不可接受的值,您将收到错误 1280 (GL_INVALID_ENUM)。因此,您的问题是不支持 GL_LINE_STRIP。

    GL_INVALID_OPERATION is generated if glBegin is executed between a glBegin and the corresponding execution of glEnd.
    
    GL_INVALID_OPERATION is generated if glEnd is executed without being preceded by a glBegin.
    
    GL_INVALID_OPERATION is generated if a command other than glVertex, glColor, glSecondaryColor, glIndex, glNormal, glFogCoord, glTexCoord, glMultiTexCoord, glVertexAttrib, glEvalCoord, glEvalPoint, glArrayElement, glMaterial, glEdgeFlag, glCallList, or glCallLists is executed between the execution of glBegin and the corresponding execution glEnd.
    

    GL_INVALID_OPERATION 返回错误 1282 和 GL_INVALID_ENUM 1280 ...所以很大程度上取决于您遇到的确切错误...

    【讨论】:

    • 你得到什么错误?错误来自 glGetUniformLocation 还是 glUniform4f?
    • 如果我在方法中包含 glGetUniformLocation ,那么错误就在该行之后,但如果我不包含该行并将 EyePos 作为私有成员,错误仍然会发生。错误号是 1280,这就是我所知道的。 EyePos 的值为-1。
    • 好吧,如果 glGetUniformLocation 失败,那么您的“程序”值很可能是错误的,或者无法在程序中找到“EyePosition”。另请注意:1280 是一个不同的错误,而不是 glGetUniformLocation 应该返回的错误。如果你得到 1281 是因为“程序”无效。
    • 如果我的程序值是错误的,那么当我初始化着色器时会不会出错,而不仅仅是当我调用更新变量时?到那时找到 EyePosition 也不会有问题吗?
    • 我刚刚注意到该错误实际上并没有发生在着色器中,并且更新工作正常,我的愚蠢错误,我会在帖子中发布更新。
    猜你喜欢
    • 2014-02-24
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 2021-08-24
    • 1970-01-01
    相关资源
    最近更新 更多