Libgdx着色器设置NullPointerException

3
我尝试按照以下方式设置我的着色器:
fog = new ShaderProgram(Gdx.files.local("shader/shad.vert"), Gdx.files.local("shader/shad.frag"));

但是它给我返回了这个异常:
Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: java.lang.NullPointerException
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:113)
Caused by: java.lang.NullPointerException
    at com.badlogic.gdx.graphics.glutils.ShaderProgram.loadShader(ShaderProgram.java:194)
    at com.badlogic.gdx.graphics.glutils.ShaderProgram.compileShaders(ShaderProgram.java:173)
    at com.badlogic.gdx.graphics.glutils.ShaderProgram.<init>(ShaderProgram.java:156)
    at com.badlogic.gdx.graphics.glutils.ShaderProgram.<init>(ShaderProgram.java:165)
    at Comet.Avoider.CometAvoider.create(CometAvoider.java:73)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:127)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:110)

我的着色器代码如下:

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
uniform mat4 u_projTrans;
varying vec4 v_color;
varying vec2 v_texCoords;
void main() {
    v_color = a_color;
    v_texCoords = a_texCoord0;
    gl_Position = u_projTrans * a_position;
}

并且

#ifdef GL_ES
precision mediump float;
#endif
varying vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;
void main() {
    gl_FragColor = v_color * texture2D(u_texture, v_texCoords);
}

我不知道错误在哪里 :( 我无法修复它。希望您能帮助我。谢谢!


请问您能否发布一下使用此着色器的代码片段? - Kumar Saurabh
1
请在着色器初始化之前提及代码片段。问题可能是因为您没有使用OpenGL 2.0。对于着色器编程,您需要使用OpenGL 2.0。 - Vikalp Jain
2个回答

8
以下是ShaderProgram的loadShader源代码: https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/glutils/ShaderProgram.java#L196 构造函数会读取文件内容,所以如果您已经通过了这一部分,那么文件可能是没有问题的。
我怀疑问题出在这行代码上:
GL20 gl = Gdx.graphics.getGL20();

如果你的代码没有配置OpenGL ES 2.0,你可以直接尝试使用getGL20()方法来查看是否会出错。

文档中指出,如果你的应用程序没有配置OpenGL ES 2.0,getGL20()方法将返回null。默认情况下,你只能获得1.x版本的支持。1.x版本的OpenGL ES不支持着色器,因此你必须通过在应用程序配置中设置useGL20标志来进行配置。请参见https://code.google.com/p/libgdx/wiki/ApplicationConfiguration


0

调试:

Gdx.files或Gdx为空?这可能是你的问题。


2
如果它们是空的,调用栈就不会到达“ShaderProgram”。 - P.T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接