0

我收到以下错误致命信号11(SIGSEGV),代码1(SEGV_MAPERR),tid 14795中的故障地址0x0(GLThread 39),pid 14605(.example.opengl)当我试图通过在android工作室中使用Open GL ES将深度贴图应用于2D图像来创建3D视差效果时。

这是我的渲染器类

包com.example.opengl;公共类Renderer实现GLSurfaceView。渲染器{float[]顶点={-1, -1,1, -1,1, 1,-1, -1,1, 1,-1, 1};float[]texcoords={0, 0,1, 0,1, 1,0, 0,1, 1,0, 1};FloatBuffer texcoordBuffer;int[]纹理;私有最终字符串vertexShaderCode=“属性vec2位置;\n”+“属性vec2 texcoord;\n”+“统一mat3 u_matrix;\n”+“改变vec2 v_texcoord;\n”+“void main(){\n”+“gl_Position=vec4(u_matrix*vec3(位置,1),1);\n”+“v_texcoord=texcoord;\n”+“}\n”;//片段着色器源代码私有最终字符串片段ShaderCode=“precision medium float;\n”+“统一vec2 u_mouse;\n”+“统一采样器2D u_originalImage;\n”+“统一采样器2D u_mapImage;\n”+“改变vec2 v_texcoord;\n”+“void main(){\n”+“vec4 depthDistortion=texture2D(u_mapImage,v_texcoord);\n”+“float parallaxMult=depthDistortion.r;\n”+“vec2视差=(u_mouse)*视差Mult;\n”+“vec4 original=texture2D(u_originalImage,(v_texcoord+视差));\n”+“gl_FragColor=原始;\n”+“}\n”;//OpenGL程序句柄private int mProgram;//OpenGL属性控制柄private int mPositionHandle;private int mTexcoordHandle;//OpenGL统一手柄private int mMatrixHandle;private int mMouseHandle;FloatBuffer vertexBuffer;private int mOriginalImageHandle;private int mMapImageHandle;int originalTexture;int mapTexture;浮动鼠标X;浮动鼠标Y;语境语境;//用于变换顶点的矩阵私有最终浮点[]mMatrix=新浮点[9];公共渲染器(上下文上下文){this.context=上下文;}@覆盖public void onSurfaceCreated(GL10 gl,EGLConfig config){//加载和编译着色器initBuffers();int vertexShader=loadShader(GLES20.GL_VERTEX_SHADER,vertexShaderCode);int fragmentShader=loadShader(GLES20.GL_FRAGMENT_SHADER,fragmentShaderCode);//创建OpenGL程序mProgram=GLES20.glCreateProgram();GLES20.glAttachShader(mProgram,顶点着色器);GLES20.glAttachShader(mProgram,fragmentShader);GLES20.glLinkProgram(mProgram);//获取属性和统一句柄mPositionHandle=GLES20.glGetAttribLocation(mProgram,“位置”);mTexcoordHandle=GLES20.glGetAttribLocation(mProgram,“texcoord”);mMatrixHandle=GLES20.glGetUniformLocation(mProgram,“u_matrix”);mMouseHandle=GLES20.glGetUniformLocation(mProgram,“u_mouse”);mOriginalImageHandle=GLES20.glGetUniformLocation(mProgram,“u_originalImage”);mMapImageHandle=GLES20.glGetUniformLocation(mProgram,“u_mapImage”);纹理=新int[2];GLES20.glGenTextures(2,纹理,0);//加载原始图像纹理位图originalBitmap=BitmapFactory.decodeResource(context.getResources(),R.drawable.mind);GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,纹理[0]);GLUtils.texImage2D(GLES20.GL_TEXTURE_2D,0,原始位图,0);originalBitmap.recycle();//设置纹理参数GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXMURE_MIN_FILTER,GLES50.GL_LINEAR);GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXMURE_MAG_FILTER,GLES50.GL_LINEAR);GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXMURE_WRAP_S,GLES50.GL_CLAMP_TO_EDGE);GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXMURE_WRAP_T,GLES50.GL_CLAMP_TO_EDGE);//加载贴图图像纹理位图mapBitmap=位图工厂.decodeResource(context.getResources(),R.drawable.my_depth_map);GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,纹理[1]);GLUtils.texImage2D(GLES20.GL_TEXTURE_2D,0,映射位图,0);mapBitmap.recycle();//设置纹理参数GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXMURE_MIN_FILTER,GLES50.GL_LINEAR);GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXMURE_MAG_FILTER,GLES50.GL_LINEAR);GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXMURE_WRAP_S,GLES50.GL_CLAMP_TO_EDGE);GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXMURE_WRAP_T,GLES50.GL_CLAMP_TO_EDGE);//取消绑定纹理GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,0);originalTexture=纹理[0];mapTexture=纹理[1];鼠标X=0.5f;鼠标Y=0.5f;//将转换矩阵初始化为标识矩阵.setIdentityM(mMatrix,0);}@覆盖public void onSurfaceChanged(GL10 gl,int width,int height){//设置视口GLES20.glViewport(0,0,宽度,高度);}@覆盖DrawFrame上的公共void(GL10 GL10){//使用程序GLES20.glUseProgram(mProgram);//设置属性数据GLES20.glEnableVertexAttribArray(mPositionHandle);GLES20.glVertexAttribPointer(mPositionHandle,2,GLES20.GL_FLOAT,false,0,vertexBuffer);GLES20.glEnableVertexAttribArray(mTexcoordHandle);GLES20.glVertexAttribPointer(mTexcoordHandle,2,GLES20.GL_FLOAT,false,0,texcoordBuffer);//设置统一数据GLES20.glUniformMatrix3fv(mMatrixHandle,1,false,mMatrix,0);GLES20.glUniform2f(鼠标手柄,鼠标X,鼠标Y);GLES20.glUniform1i(mOriginalImageHandle,0);GLES20.glUniform1i(mMapImageHandle,1);//绑定纹理GLES20.glActiveTexture(GLES20.GL_TEXTURE0);GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,原始纹理);GLES20.glActiveTexture(GLES20.GL_TEXTURE1);GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,mapTexture);//绘制三角形GLES20.glDrawArrays(GLES20.GL_TRIANGLES,0,6);//取消绑定纹理并禁用属性数组GLES20.glActiveTexture(GLES20.GL_TEXTURE0);GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,0);GLES20.glActiveTexture(GLES20.GL_TEXTURE1);GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,0);GLES20.glDisableVertexAttribArray(mPositionHandle);GLES20.glDisableVertexAttribArray(mTexcoordHandle);}//从源代码加载着色器private int loadShader(int类型,String源代码){int shader=GLES20.glCreateShader(类型);GLES20.glShaderSource(着色器,源);GLES20.glCompileShader(着色器);返回着色器;}私有void initBuffers(){vertexBuffer=ByteBuffer.allocateDirect(vertices.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer();vertexBuffer.put(顶点);顶点缓冲区位置(0);texcoordBuffer=ByteBuffer.allocateDirect(texcoords.length*4).order(ByteOrder.nativeOrder())texcoordBuffer.put(texcoods);texcoordBuffer.position(0);}}在此处键入

我的活动代码

包com.example.opengl;公共类MainActivity扩展了AppCompatActivity{@覆盖protected void onCreate(捆绑保存的实例状态){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);GLSurfaceView GLSurfaceView=findViewById(R.id.my_sdsd);渲染器渲染器=新渲染器(this);glSurfaceView.setRenderer(渲染器);}}

在调试代码时,我发现它在使用以下方法创建着色器时崩溃

private int loadShader(int类型,String源代码){**int shader=GLES20.glCreateShader(类型);**//在这条线上撞车GLES20.glShaderSource(着色器,源);GLES20.glCompileShader(着色器);返回着色器;}

有人能帮我一下吗,因为我对Open GL和图形编程很陌生。我只想用2D图像和传感器值创建一个假3D效果。

1答案1

重置为默认值
0

尝试将此代码添加到AndroidManifest

<android:hardwareAccelerated=“false”>

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.