Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.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 柏林噪声着色器_Android_Opengl Es_Opengl Es 2.0_Shader_Glsurfaceview - Fatal编程技术网

Android 柏林噪声着色器

Android 柏林噪声着色器,android,opengl-es,opengl-es-2.0,shader,glsurfaceview,Android,Opengl Es,Opengl Es 2.0,Shader,Glsurfaceview,我正在尝试为我的一个应用程序创建动画背景 基本上,我希望我的活动显示为背景。为了降低能耗,我尝试使用OpenGL做所有事情。不幸的是,我对OpenGL知之甚少 我从一开始就很成功。然后,我尝试替换正方形的绘图代码和顶点/片段着色器,但最终出现运行时异常 我正在尝试使用以下顶点着色器: uniform mat4 uMVPMatrix; attribute vec4 vPosition; void main() { gl_Position = uMVPMatrix * vPosition;

我正在尝试为我的一个应用程序创建动画背景

基本上,我希望我的活动显示为背景。为了降低能耗,我尝试使用OpenGL做所有事情。不幸的是,我对OpenGL知之甚少

我从一开始就很成功。然后,我尝试替换正方形的绘图代码和顶点/片段着色器,但最终出现运行时异常

我正在尝试使用以下顶点着色器:

uniform mat4 uMVPMatrix;
attribute vec4 vPosition;

void main()
{
    gl_Position = uMVPMatrix * vPosition;
}
并稍微更改了片段着色器,从:

绘图功能:

public void draw(float[] mvpMatrix)
{
    GLES20.glUseProgram(m_program);

    int positionHandle = GLES20.glGetAttribLocation(m_program, "vPosition");
    GLES20.glEnableVertexAttribArray(positionHandle);

    int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex
    GLES20.glVertexAttribPointer(positionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, m_vertexBuffer);

    int timeHandle = GLES20.glGetUniformLocation(m_program, "time");
    GLES20.glUniform1f(timeHandle, time);

    int mvpMatrixHandle = GLES20.glGetUniformLocation(m_program, "uMVPMatrix");
    BackgroundRenderer.checkGlError("glGetUniformLocation");

    GLES20.glUniformMatrix4fv(mvpMatrixHandle, 1, false, mvpMatrix, 0);
    BackgroundRenderer.checkGlError("glUniformMatrix4fv");

    GLES20.glDrawElements(GLES20.GL_TRIANGLES, drawOrder.length, GLES20.GL_UNSIGNED_SHORT, m_drawListBuffer);

    GLES20.glDisableVertexAttribArray(positionHandle);
}
不幸的是,我得到的只是

java.lang.RuntimeException: glGetUniformLocation: glError 1282
在这条线上提出

int mvpMatrixHandle = GLES20.glGetUniformLocation(m_program, "uMVPMatrix");
我应该如何更改代码?

这里有几个问题:
  • 您从未检查过着色器编译日志,如果检查过,您将看到片段着色器未编译
  • 仅在一次调用后检查
    glGetError(…)
    ,因此您认为
    int mvpMatrixHandle=GLES20.glGetUniformLocation(m_程序,“uMVPMatrix”)
    GL\u INVALID\u操作的源,而实际上
    glUseProgram(…)
    是函数中触发该操作的第一行代码
  • 我已经更正了你的顶点和片段着色器,以便它们可以编译。。。不能在片段着色器中使用
    gl\u Position
    ,这就是着色器无法编译且程序未链接的原因

    修改的顶点着色器: 修改的片段着色器:
    首先,检查GLSL编译/链接日志。如果正在引发
    GL\u无效\u操作
    (0x0502这可能是一个长期拍摄,因为这是旧的,但我正在寻找做同样的事情,你已经做了,我想知道你是否可以把你的最终代码,这是一个要点。我觉得有一些东西错过了你的答案。它帮助了很多。此外,我把
    精度mediump float;
    到片段着色器中,因为着色器编译器正在抱怨
    错误:0:25:“vec3”:没有为此类型定义精度。
    
    int mvpMatrixHandle = GLES20.glGetUniformLocation(m_program, "uMVPMatrix");
    
    uniform   mat4 uMVPMatrix;
    attribute vec4 vPosition;
    varying   vec4 vtx_pos;
    
    void main()
    {
        gl_Position = uMVPMatrix * vPosition;
        vtx_pos     = gl_Position;
    }
    
    varying vec4  vtx_pos;
    uniform float time; // Used for texture animation
    
    float snoise(vec3 v) { 
      // ..
    }
    
    void main( void )
    {
      vec3 v_texCoord3D = vtx_pos.xyz; 
    
      vec3 uvw = v_texCoord3D + 0.1*vec3(snoise(v_texCoord3D + vec3(0.0, 0.0, time)),
        snoise(v_texCoord3D + vec3(43.0, 17.0, time)),
        snoise(v_texCoord3D + vec3(-17.0, -43.0, time)));
      // Six components of noise in a fractal sum
      float n = snoise(uvw - vec3(0.0, 0.0, time));
      n += 0.5 * snoise(uvw * 2.0 - vec3(0.0, 0.0, time*1.4)); 
      n += 0.25 * snoise(uvw * 4.0 - vec3(0.0, 0.0, time*2.0)); 
      n += 0.125 * snoise(uvw * 8.0 - vec3(0.0, 0.0, time*2.8)); 
      n += 0.0625 * snoise(uvw * 16.0 - vec3(0.0, 0.0, time*4.0)); 
      n += 0.03125 * snoise(uvw * 32.0 - vec3(0.0, 0.0, time*5.6)); 
      n = n * 0.7;
      // A "hot" colormap - cheesy but effective 
      gl_FragColor = vec4(vec3(1.0, 0.5, 0.0) + vec3(n, n, n), 1.0);
    }