在 glUseProgram 中设置 GL_TEXTURE_CUBE_MAP 导致 GL_INVALID_OPERATION
Setting GL_TEXTURE_CUBE_MAP cause GL_INVALID_OPERATION in glUseProgram
我正在使用以下函数加载我的立方体贴图。没有加载,就没有错误。每当我设置立方体贴图纹理下一个 glUseProgram()
函数时,都会导致 GL_INVALID_OPERATION 错误;
unsigned int Model::loadCubemap(std::vector<std::string> faces){
GLuint CubeMapOrder[] = {
GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
};
unsigned int textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_CUBE_MAP, textureID);
int width, height, nrComponents;
for (unsigned int i = 0; i < faces.size(); i++){
unsigned char *data = stbi_load(faces[i].c_str(), &width, &height, &nrComponents, 0);
if (data){
GLenum format;
if (nrComponents == 1){
format = GL_RED;
}else if (nrComponents == 3){
format = GL_RGB;
}else if (nrComponents == 4){
format = GL_RGBA;
}
glTexImage2D(CubeMapOrder[i], 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
stbi_image_free(data);
}else{
std::cout << "Cubemap texture failed to load at path: " << faces[i] << std::endl;
stbi_image_free(data);
}
}
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
return textureID;
}
我正在像这样为立方体贴图着色器设置我的立方体贴图;
GLuint TextureID = glGetUniformLocation(ShaderProgram::shaders[shadername]->programID, "skybox");
glActiveTexture(GL_TEXTURE8);
glBindTexture(GL_TEXTURE_CUBE_MAP, cubemapTexture);
glUniform1i(TextureID, 8);
对于第一个立方体贴图着色器,它可以工作。我看到了天空盒。但是另一个不使用天空盒纹理的着色器会出错。
两个着色器都使用相同的顶点数组对象。但是天空盒是纹理8。我认为问题是纹理参数。因为
如果我不设置这些
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
没有问题。
我进行了一些挖掘,但找不到我的问题。
为什么设置glTexParameteri会报错,没有render。
我只是为 GL_TEXTURE_CUBE_MAP 设置一个参数。即使是错误的,为什么其他纹理会受到影响?
如果你有类似的东西
uniform samplerCube PointShadowMapTexture[MAX_POINT_LIGHT];
您必须统一 samplerCube 数组中的所有元素。否则会出现黑屏。或者您清除 color.Also 后续绘制调用可能会导致无效操作。
最好用空白 1x1 纹理统一所有未使用的采样器类型。
我正在使用以下函数加载我的立方体贴图。没有加载,就没有错误。每当我设置立方体贴图纹理下一个 glUseProgram()
函数时,都会导致 GL_INVALID_OPERATION 错误;
unsigned int Model::loadCubemap(std::vector<std::string> faces){
GLuint CubeMapOrder[] = {
GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
};
unsigned int textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_CUBE_MAP, textureID);
int width, height, nrComponents;
for (unsigned int i = 0; i < faces.size(); i++){
unsigned char *data = stbi_load(faces[i].c_str(), &width, &height, &nrComponents, 0);
if (data){
GLenum format;
if (nrComponents == 1){
format = GL_RED;
}else if (nrComponents == 3){
format = GL_RGB;
}else if (nrComponents == 4){
format = GL_RGBA;
}
glTexImage2D(CubeMapOrder[i], 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
stbi_image_free(data);
}else{
std::cout << "Cubemap texture failed to load at path: " << faces[i] << std::endl;
stbi_image_free(data);
}
}
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
return textureID;
}
我正在像这样为立方体贴图着色器设置我的立方体贴图;
GLuint TextureID = glGetUniformLocation(ShaderProgram::shaders[shadername]->programID, "skybox");
glActiveTexture(GL_TEXTURE8);
glBindTexture(GL_TEXTURE_CUBE_MAP, cubemapTexture);
glUniform1i(TextureID, 8);
对于第一个立方体贴图着色器,它可以工作。我看到了天空盒。但是另一个不使用天空盒纹理的着色器会出错。
两个着色器都使用相同的顶点数组对象。但是天空盒是纹理8。我认为问题是纹理参数。因为
如果我不设置这些
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
没有问题。
我进行了一些挖掘,但找不到我的问题。
为什么设置glTexParameteri会报错,没有render。
我只是为 GL_TEXTURE_CUBE_MAP 设置一个参数。即使是错误的,为什么其他纹理会受到影响?
如果你有类似的东西
uniform samplerCube PointShadowMapTexture[MAX_POINT_LIGHT];
您必须统一 samplerCube 数组中的所有元素。否则会出现黑屏。或者您清除 color.Also 后续绘制调用可能会导致无效操作。
最好用空白 1x1 纹理统一所有未使用的采样器类型。