我一直在关注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()方法之前调用。
答案 0 :(得分:7)
找到了真正的问题:我只是个白痴。
我真的怀疑任何人都会愚蠢地复制这个,但为了防止其他人盲目地跟踪教程直到凌晨4点,问题是:
shader.addVertexShader(ResourceLoader.loadShader("basicVertex.vs"));
shader.addVertexShader(ResourceLoader.loadShader("basicFragment.fs"));
正如您所看到的,我为“basicFragment.fs”着色器调用了addVertexShader,它应该是addFragmentShader。
感谢您的回复,对不起浪费您的时间。