Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android设备上OpenGL片段着色器中的SIGSEGV_Android_Opengl Es_Glsl - Fatal编程技术网

Android设备上OpenGL片段着色器中的SIGSEGV

Android设备上OpenGL片段着色器中的SIGSEGV,android,opengl-es,glsl,Android,Opengl Es,Glsl,我在android应用程序中使用了一个片段着色器,它使用的是GLES 2.0,在模拟器上运行良好,但当我尝试链接着色器程序时,在Nexus 4上出现“致命信号11(SIGSEGV)在0x00000004(代码=1)”崩溃 我基本上是从谷歌的教程()开始的,然后从那里开始 这是顶点着色器: uniform mat4 uMVPMatrix; varying vec2 vTexcoord; attribute vec4 vPosition; void main() { gl_Position =

我在android应用程序中使用了一个片段着色器,它使用的是GLES 2.0,在模拟器上运行良好,但当我尝试链接着色器程序时,在Nexus 4上出现“致命信号11(SIGSEGV)在0x00000004(代码=1)”崩溃

我基本上是从谷歌的教程()开始的,然后从那里开始

这是顶点着色器:

uniform mat4 uMVPMatrix;
varying vec2 vTexcoord;
attribute vec4 vPosition;
void main() {
  gl_Position = uMVPMatrix * vPosition;
  vTexcoord = vPosition.xy * vec2(0.5) + vec2(0.5);
}
这是片段着色器:

precision mediump float;
uniform sampler2D uTexture1;
uniform sampler2D uTexture2;
uniform float pointX;
uniform float pointY;
uniform float opening;
uniform float openingBufferZone;
uniform vec4 aColor;
varying vec2 vTexcoord;
float sizeX = 2048.0;
float sizeY = 512.0;
void main() {
  float x = (vTexcoord.x * sizeX) - pointX;
  float y = (vTexcoord.y * sizeY) - pointY;
  float distance = x * x + y * y;
  if (distance < opening) {
    gl_FragColor = texture2D(uTexture2, vTexcoord) * aColor;
  } else {
    if (distance >= opening && distance < opening + openingBufferZone) {
      float inner = (distance-opening)/openingBufferZone;
      vec4 c1 = (vec4(inner,inner,inner,1.0) * texture2D(uTexture1, vTexcoord) * aColor);
      vec4 c2 = (vec4(inner,inner,inner,1.0) * texture2D(uTexture2, vTexcoord) * aColor);
      gl_FragColor = c1 + c2;
    } else {
      gl_FragColor = texture2D(uTexture1, vTexcoord) * aColor;
    }
  }
}
尝试执行最后一行
GLES20.glLinkProgram(mProgram)时出错

由于某些原因,顶点着色器中的这两条线似乎会导致问题:

vec4 c1 = (vec4(inner,inner,inner,1.0) * texture2D(uTexture1, vTexcoord) * aColor);
vec4 c2 = (vec4(inner,inner,inner,1.0) * texture2D(uTexture2, vTexcoord) * aColor);
如果我把它们改成

vec4 c1 = (vec4(inner,inner,inner,1.0) * texture2D(uTexture1, vTexcoord) * aColor);
vec4 c2 = (vec4(inner,inner,inner,1.0) * texture2D(uTexture1, vTexcoord) * aColor);


其他一切都保持原样,程序运行良好(尽管显然不是预期的)。

似乎是Nexus4中的一个问题,我也面临着这个问题。但还没有解决办法。这里有一些链接


将此作为答案发布,因为在评论中可能看不到解决方法


将其中一行更改为(例如,
vec4 c1=(texture2D(uTexture1,vTexcoord)*aColor*vec4(内部,内部,内部,1.0)),即只需更改操作数的顺序即可使着色器再次工作。

使用这一行也有相同的效果

gl_FragColor = vec4(float(i) / 100.0,0.0,0.0,1.0);

看起来,当您在函数中嵌入操作时,opengles不喜欢它。

由于可能不是着色器本身导致问题,而是使用和接口它的代码,我们需要查看更多代码。我怀疑你没有根据你的申请代码或类似的东西正确设置那些
sampler2D
制服。谢谢你的快速回复。我添加了一些(希望是相关的)代码部分。嗯,看起来一切都很好。您可以做的是检查返回的统一位置是否不是
-1
(这意味着GLSL编译器找不到它们),因为在这种情况下
glGetUniformLocation
不会引发GL错误。但是我不知道为什么它们不存在(虽然着色器代码可能也有帮助)。我也将检查返回值。我尝试检查返回值,但发现在尝试链接着色器程序时,错误已经发生得更早。我正在编辑这个问题以反映这一点。已经谢谢你的想法了!
vec4 c1 = (vec4(inner,inner,inner,1.0) * texture2D(uTexture2, vTexcoord) * aColor);
vec4 c2 = (vec4(inner,inner,inner,1.0) * texture2D(uTexture2, vTexcoord) * aColor);
gl_FragColor = vec4(float(i) / 100.0,0.0,0.0,1.0);