Android GLES20链接/编译调试

时间:2015-10-03 00:13:51

标签: android debugging opengl opengl-es shader

我遇到一些问题,一些GLES着色器无法编译,我的应用程序只是崩溃了"不幸的是,应用已停止。"。请注意,这不是所有着色器,所以我假设我的其他代码加载并运行着色器是可以的。

我尝试将以下代码添加到我的应用中,以检测并显示编译失败时的调试信息。

GLES20.glCompileShader(shader);
int[] compiled = new int[1];
GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
if (compiled[0] == 0) {
    Log.e("APP", "Could not compile shader");
    Log.e("APP", GLES20.glGetShaderInfoLog(Globals.shaderProgram));
    Log.e("APP", "Could not compile shader 2");
}

从Android Studio运行时(刚刚更新到最新且最好的1.4版本),LogCat会显示"无法编译着色器"日志条目,但没有给我任何进一步的信息,这使得试图确定着色器失败的原因。 GLES20.glGetShaderInfoLog不返回任何内容。我也看到下一个"无法编译着色器2"所以代码继续。

由于链接失败,应用程序在进入GLES20.glLinkProgram调用时崩溃。最终的logcat错误是" glCreateProgram:glError 1281"

有什么方法可以从GLES链接(和编译)我的着色器时看到崩溃的内容,从而获得更有意义的调试消息?在Windows下,我能够从编译器中获取信息,并在着色器失败时显示错误行号等。

非常感谢任何帮助。

这是固定代码。我指的是错误的变量。

GLES20.glCompileShader(shader);
//checkGlError("VOC", "glCompileShader");
int[] compiled = new int[1];
GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);
if (compiled[0] == 0) {
    Log.e("VOC", "Could not compile shader");
    Log.e("VOC", GLES20.glGetShaderInfoLog(shader));
    GLES20.glDeleteShader(Globals.shaderProgram);
    shader = 0;
    Log.e("VOC", "Could not compile shader 2");
}

正如Reto所指出的,一旦我使用从glGetShaderiv返回的变量,它就会起作用并返回错误" 0(45):错误C7011:来自" float"到" vec3"。似乎GLES在铸造时更加挑剔。在Windows(或NVidia)中,它接受

vec3 tex = 1.0;

但是android(至少我的三星Galaxy note 5)需要

vec3 tex = vec3(1.0,1.0,1.0);

感谢您的帮助!获取行号和错误使调试变得更加容易。

0 个答案:

没有答案