这是我的顶点着色器代码

const GLchar* Vshader_source =
        "#version 130 \n"
        "in vec3 position; \n"
        "uniform float moving = 0.0;\n"
        "void main(){ \n"
        "gl_Position = vec4(position.x,position.y - moving,position.z,1.0);\n"
        "}";


这是我程序的窗口循环+统一选择功能,以及顶点格式

GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(posAttrib,3, GL_FLOAT,GL_FALSE,0,0);
glEnableVertexAttribArray(posAttrib );

GLint uniVex = glGetUniformLocation(shaderProgram,"moving");

time_t new = time(NULL) + 1;
char error_num = 0;
GLfloat vexnum = 0.1f;
while(!glfwWindowShouldClose(window)){
                glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                if (!error_num){
                        fprintf(stderr,"%d\n",glGetError());
                        error_num++;
                }
                if (time(NULL) == new){
                        new++;
                        glUniform1f(uniVex,vexnum += 0.1f);
                }
                glDrawArrays(GL_TRIANGLES,0,3);
                glfwSwapBuffers(window);
                glfwPollEvents();
        }


它以前工作过,当“均匀浮标移动= 0.0”时,我可以看到三角形。被删除,而gl_position只是“ gl_Position = vec4(position,1.0);”。但是当我为制服调整它时,它不会画任何东西,并且glgeterror()返回1282。我向上看,但似乎没有人对错误1282给出答案。

最佳答案

glUniform手册页中,在以下情况下会出现GL_INVALID_OPERATION


如果没有当前程序对象,则生成。
如果在着色器中声明的统一变量的大小与glUniform命令指示的大小不匹配,则生成。
如果此函数的整数变体之一用于加载类型float,vec2,vec3,vec4或这些数组的统一变量,或者此函数的浮点变体之一用于加载,则生成类型为int,ivec2,ivec3或ivec4的统一变量,或这些变量的数组。
如果location是当前程序对象的无效统一位置并且位置不等于-1,则生成。
如果count大于1并且指示的统一变量不是数组变量,则生成。
如果使用glUniform1i和glUniform1iv以外的命令加载采样器,则会生成。
如果在glBegin()的执行和相应的glEnd()的执行之间执行glUniform,则会生成。


从您的代码摘录中,在我看来,问题可能出在项目1或项目4上

09-08 11:33