1

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

我基本上是从谷歌的教程(http://developer.android.com/training/graphics/opengl/draw.html)开始的,然后从那里拿走了。

这是顶点着色器:

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;
    }
  }
}

这就是我加载着色器的方式:

int vertexShader = GLActivity.loadShader(GLES20.GL_VERTEX_SHADER,
                                                   vertexShaderCode);
int fragmentShader = GLActivity.loadShader(GLES20.GL_FRAGMENT_SHADER,
                                                     fragmentShaderCode);
mProgram = GLES20.glCreateProgram();             
GLES20.glAttachShader(mProgram, vertexShader);   
GLES20.glAttachShader(mProgram, fragmentShader); 
GLES20.glLinkProgram(mProgram);                  

尝试执行最后一行时发生错误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);

或者

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

并保留其他所有内容,程序运行良好(尽管显然不是预期的)。

4

3 回答 3

1

使用这条线也有同样的效果。

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

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

于 2014-04-10T03:18:55.823 回答
0

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

将其中一行更改为 (eg) vec4 c1 = (texture2D(uTexture1, vTexcoord) * aColor * vec4(inner,inner,inner,1.0));,即简单地更改操作数的顺序使着色器再次工作。

于 2013-08-27T16:14:34.030 回答