OpenGL着色器:glLinkProgram()和glValidateProgram()不起作用

hac*_*soi 3 java opengl 3d shader

我一直在关注教程,那个特定的视频就是我的问题所在.那时在视频中,他开始整理他的Shader课程(顺便说一下,我复制了他所做的一切).无论如何,当我调用compileShader()方法时,看起来像这样,

public void compileShader()
{
    glLinkProgram(program);

    if(glGetProgrami(program, GL_LINK_STATUS) == GL_FALSE)
    {
        System.err.println(glGetShaderInfoLog(program, 1024));
        System.exit(1);
    }

    glValidateProgram(program);

    if(glGetProgrami(program, GL_VALIDATE_STATUS) == GL_FALSE)
    {
        System.err.println(glGetShaderInfoLog(program, 1024));
        System.exit(1);
    }
} 
Run Code Online (Sandbox Code Playgroud)

我的程序崩溃是因为glGetProgrami(程序,GL_LINK_STATUS)总是等于GL_FALSE(GL_FALSE == 0).对于glGetProgrami(程序,GL_VALIDATE_STATUS),它返回GL_FALSE.顺便说一句,我使用glGetProgrami()而不是glGetProgram(),因为后者是一个不推荐使用的方法.另外,System.err.println(glGetShaderInfoLog(program,1024))不会打印ANYTHING.

在对主要问题进行彻底的在线搜索之后,是我能找到的唯一类似于我的问题的线程,它实际上似乎是完全相同的问题.他的解决方案是更改他的英特尔显卡的3D设置,但是当我尝试按照他的步骤操作时,我没有相同的选项来配置3D设置.事实证明,我的笔记本电脑用于配置英特尔图形设置的程序与他的不同!

因此,花了几个小时在网上寻找获取控制面板的解决方案,这只是安装驱动程序,其中没有一个实际工作,我遇到了这个线程.第三篇文章说这些选项已经过时了,我所拥有的选项是我唯一需要的选项.但在搞乱我的设置后,没有改变.该程序仍然崩溃.

我不明白为什么glLinkProgram(程序)没有链接程序以及为什么glGetShaderInfoLog()不返回任何东西.

编辑:

private void addProgram(String text, int type)
{
    int shader = glCreateShader(type);

    if(shader == 0)
    {
        System.err.println("Shader creation failed: Could not find valid memory location when adding shader");
        System.exit(1);
    }

    glShaderSource(shader, text);
    glCompileShader(shader);

    if(glGetShaderi(shader, GL_COMPILE_STATUS) == GL_FALSE)
    {
        System.err.println(glGetShaderInfoLog(shader, 1024));
        System.exit(1);
    }

    glAttachShader(program, shader);
}
Run Code Online (Sandbox Code Playgroud)

这是实际调用glCompileShader()的代码.只要您想添加着色器,就会调用它.这部分是成功的,在compile()方法之前调用.

hac*_*soi 8

发现了真正的问题:我只是个白痴.

我真的怀疑任何人都会愚蠢地复制这个,但是为了防止其他人盲目地跟踪教程直到凌晨4点,问题是:

    shader.addVertexShader(ResourceLoader.loadShader("basicVertex.vs"));
    shader.addVertexShader(ResourceLoader.loadShader("basicFragment.fs"));
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我为"basicFragment.fs"着色器调用了addVertexShader,它应该是addFragmentShader.

感谢您的回复,对不起浪费您的时间.