我试图让OpenGL计算着色器工作,但当我编译它,但编译失败,OpenGL没有给我任何信息日志。
着色器非常简单(我想找出错误所在,所以我将其更改为应该可以工作的超级简单版本)
# version 460 core
// for nvidia cards this should be 32 or a multiple of it
layout(local_size_x = 8, local_size_y = 4) in;
void main() {
int x = 1;
}
和CPP代码:
compute = glCreateShader(GL_COMPUTE_SHADER);
glShaderSource(compute, 1, &code, NULL);
glCompileShader(compute);
glGetShaderiv(compute, GL_COMPILE_STATUS, &success);
if(!success)
{
glGetShaderInfoLog(compute, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::COMPUTE::COMPILATION_FAILED\n" << infoLog << std::endl;
return 1;
};
ID = glCreateProgram();
glAttachShader(ID, compute);
glLinkProgram(ID);
glGetProgramiv(ID, GL_LINK_STATUS, &success);
if(!success)
{
glGetProgramInfoLog(ID, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
return 1;
}
glDeleteShader(compute);
我确信着色器是从文件中正确读取的(我之前已经说过了)。此外,我注意到,当我使用glCreateShader(GL_VERTEX_SHADER)
而不是计算着色器时,我确实获得了信息日志:
0:4(1) : error: input layout qualifiers only valid in geometry, tessellation, fragment and compute shaders
0:4(1) : error: invalid input lavout qualifiers used
但由于更改为glCreateShader(GL_COMPUTE_SHADER)
,我没有得到任何日志(即使我将布局中的变量名更改为明显错误的名称)
我在Windows 11、WSL2 Ubuntu 20.04和NVIDIA RTX 3080TI上工作,
我的OpenGL版本是:
server glx version string: 1.4
client glx version string: 1.4
GLX version: 1.4
Max core profile version: 4.6
Max compat profile version: 4.6
Max GLES1 profile version: 1.1
Max GLES [23] profile version: 3.0
OpenGL core profile version string: 4.6 (Core Profile) Mesa 21.2.6
OpenGL core profile shading language version string: 4.60
OpenGL version string: 4.6 (Compatibility Profile) Mesa 21.2.6
OpenGL shading language version string: 4.60
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 21.2.6
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
我的OpenGL上下文初始化如下所示:
glutInit(&argc, argv);
// we need opengl 4.6 context for compute shaders
glutInitContextVersion( 4, 6 );
glutInitContextProfile( GLUT_CORE_PROFILE );
glutInitDisplayMode(GLUT_SINGLE);
glutInitWindowSize(WORLD_WIDTH, WORLD_HEIGHT);
glutInitWindowPosition(100, 100);
glutCreateWindow("Hello World!");
glutDisplayFunc(renderScreen);
glutMotionFunc(motion);
glutIdleFunc(tick);
GLenum err = glewInit();
if (GLEW_OK != err)
{
fprintf(stderr, "error with initialising glew: %s\n", glewGetErrorString(err));
}
有谁知道为什么会出现这种情况,以及如何解决这个问题?
1条答案
按热度按时间dl5txlt91#
compute
的值是多少?有什么变化是零吗?如果是,在调用glCreateShader()
之后立即返回什么glGetError()
?如果它返回GL_INVALID_ENUM
,则由于某些原因,您的设置可能不支持计算着色器。https://registry.khronos.org/OpenGL-Refpages/gl4/html/glCreateShader.xhtml