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

时间:2014-10-12 22:00:32

标签: java opengl 3d shader

我一直在关注this教程,那个特定的视频就是我的问题所在。那时在视频中,他开始整理他的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);
    }
} 

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

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

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

我不明白为什么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);
}

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

1 个答案:

答案 0 :(得分:7)

找到了真正的问题:我只是个白痴。

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

    shader.addVertexShader(ResourceLoader.loadShader("basicVertex.vs"));
    shader.addVertexShader(ResourceLoader.loadShader("basicFragment.fs"));

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

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