glUniform4fv 给出 GL_INVALID_OPERATION

ios

1个回答

写回答

13676687098

2025-06-20 00:05

+ 关注

IOS
IOS

使用 glUniform4fv 函数时出现 GL_INVALID_OPERATION 错误通常是由于以下几种情况引起的:

1. 着色器程序未链接:在使用 glUniform4fv 函数之前,需要先将顶点着色器和片段着色器链接为一个完整的着色器程序。如果着色器程序未链接成功,则无法正确地设置 uniform 变量的值,从而导致 GL_INVALID_OPERATION 错误的出现。

2. uniform 变量未激活:uniform 变量需要在着色器程序中声明并激活才能使用。如果未激活 uniform 变量,尝试使用 glUniform4fv 函数设置其值时会出现 GL_INVALID_OPERATION 错误。

3. uniform 变量名称错误:在使用 glUniform4fv 函数设置 uniform 变量的值时,需要提供正确的 uniform 变量名称。如果使用了错误的名称,OpenGL 无法找到对应的 uniform 变量,导致 GL_INVALID_OPERATION 错误的发生。

下面是一个使用 glUniform4fv 函数出现 GL_INVALID_OPERATION 错误的案例代码:

cpp

#include <GL/glew.h>

#include <GLFW/glfw3.h>

#include <IOStream>

const char* vertexShaderSource = "#version 330 core\n"

"layout (location = 0) in vec3 aPos;\n"

"void mAIn()\n"

"{\n"

" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"

"}\0";

const char* fragmentShaderSource = "#version 330 core\n"

"out vec4 FragColor;\n"

"uniform vec4 color;\n"

"void mAIn()\n"

"{\n"

" FragColor = color;\n"

"}\0";

int mAIn()

{

// 初始化 GLFW

glfwInit();

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);

glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);

glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

// 创建窗口

GLFWwindow* window = glfwCreateWindow(800, 600, "GLFW Window", NULL, NULL);

if (window == NULL)

{

std::cout << "FAIled to create GLFW window" << std::endl;</p> glfwTerminate();

return -1;

}

glfwMakeContextCurrent(window);

// 初始化 GLEW

if (glewInit() != GLEW_OK)

{

std::cout << "FAIled to initialize GLEW" << std::endl;</p> return -1;

}

// 编译顶点着色器

GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);

glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);

glCompileShader(vertexShader);

// 编译片段着色器

GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);

glCompileShader(fragmentShader);

// 创建着色器程序

GLuint shaderProgram = glCreateProgram();

glAttachShader(shaderProgram, vertexShader);

glAttachShader(shaderProgram, fragmentShader);

glLinkProgram(shaderProgram);

// 使用着色器程序

glUseProgram(shaderProgram);

// 获取 uniform 变量的位置

GLint colorLocation = gLGetUniformLocation(shaderProgram, "color");

// 设置 uniform 变量的值

GLfloat color[] = { 1.0f, 0.0f, 0.0f, 1.0f };

glUniform4fv(colorLocation, 1, color); // 此处会出现 GL_INVALID_OPERATION 错误

// 渲染循环

while (!glfwWindowShouldClose(window))

{

// 渲染指令...

// 交换缓冲区并查询事件

glfwSwapBuffers(window);

glfwPollEvents();

}

// 清理资源

glDeleteShader(vertexShader);

glDeleteShader(fragmentShader);

glDeleteProgram(shaderProgram);

// 终止 GLFW

glfwTerminate();

return 0;

}

着色器程序未链接

在使用 glUniform4fv 函数之前,需要将顶点着色器和片段着色器链接为一个完整的着色器程序。在上述案例代码中,我们创建了一个着色器程序,并调用 glLinkProgram 函数进行链接。如果链接失败,可以通过调用 gLGetProgramInfoLog 函数获取链接错误的详细信息。

uniform 变量未激活

uniform 变量需要在着色器程序中声明并激活才能使用。在上述案例代码中,我们在片段着色器中声明了一个名为 color 的 uniform 变量。为了激活该 uniform 变量,我们需要在 glUseProgram 函数之后调用 gLGetUniformLocation 函数获取其位置。

uniform 变量名称错误

在使用 glUniform4fv 函数设置 uniform 变量的值时,需要提供正确的 uniform 变量名称。在上述案例代码中,我们使用了 "color" 作为 uniform 变量的名称。如果使用了错误的名称,OpenGL 将无法找到对应的 uniform 变量,从而导致 GL_INVALID_OPERATION 错误的发生。

使用 glUniform4fv 函数时出现 GL_INVALID_OPERATION 错误可能是由于着色器程序未链接、uniform 变量未激活或 uniform 变量名称错误引起的。在实际使用中,我们需要仔细检查这些可能的原因,以确保正确设置 uniform 变量的值。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号