Android设备上OpenGL片段着色器中的SIGSEGV
我在android应用程序中使用了一个片段着色器,它使用的是GLES 2.0,在模拟器上运行良好,但当我尝试链接着色器程序时,在Nexus 4上出现“致命信号11(SIGSEGV)在0x00000004(代码=1)”崩溃 我基本上是从谷歌的教程()开始的,然后从那里开始 这是顶点着色器: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 =
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);