Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.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 GLSL着色器问题_Android_Opengl Es_Glsl - Fatal编程技术网

Android OpenGL GLSL着色器问题

Android OpenGL GLSL着色器问题,android,opengl-es,glsl,Android,Opengl Es,Glsl,我制作的glsl着色器有问题。问题是,当我调用glCreateShader(type)-(这是compileShader方法的开头,类型是片段着色器或顶点着色器(我尝试了两者)时,它返回0,并且我还重新生成了着色器,以便在着色器代码错误的情况下它们非常基本,但这没有帮助 在我的onSurfaceCreated方法中,我最后有以下代码: String vertexShaderSource = readTextFileFromResource(this.context, R.raw.vert

我制作的glsl着色器有问题。问题是,当我调用glCreateShader(type)-(这是compileShader方法的开头,类型是片段着色器或顶点着色器(我尝试了两者)时,它返回0,并且我还重新生成了着色器,以便在着色器代码错误的情况下它们非常基本,但这没有帮助

在我的onSurfaceCreated方法中,我最后有以下代码:

    String vertexShaderSource = readTextFileFromResource(this.context, R.raw.vertex_shader);
    String fragmentShaderSource = readTextFileFromResource(this.context, R.raw.fragment_shader);

    shaderProgram = buildProgram(vertexShaderSource, fragmentShaderSource);
读取文件的方法:

public String readTextFileFromResource(Context context, int resourceId)
{
    StringBuilder body = new StringBuilder();

    try
    {
        InputStream inputStream = context.getResources().openRawResource(resourceId);
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        String nextLine;

        while((nextLine = bufferedReader.readLine()) != null)
        {
            body.append(nextLine);
            body.append('\n');
        }

    }catch (IOException ioe)
    {
        throw new RuntimeException("Could not open resource: " +resourceId, ioe);
    }catch (Resources.NotFoundException nfe)
    {
        throw new RuntimeException("Resource not found: " + resourceId, nfe);
    }

    return body.toString();
}
buildProgram代码首先编译着色器:

int fragmentShader = compileShader(GL_FRAGMENT_SHADER, fragmentSource);
int vertexShader = compileShader(GL_VERTEX_SHADER, vertexSource);
片段和顶点着色器:

void main(void)
{
    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
}

void main(void)
{
    gl_Position = gl_Vertex;
}
如果您需要任何不确定的信息或更多信息,请让我知道,此时着色器在创建着色器时卡住了

编辑:添加代码:

private int compileShader(int type, String shaderCode)
{
    int shaderHandle = glCreateShader(type);
    if(shaderHandle != 0)
    {
        // Pass the shader source
        glShaderSource(shaderHandle, shaderCode);
        // ^Upload our shader source code into the shader

        // Compile shader
        glCompileShader(shaderHandle);

        // Check compilation status
        final int[] compileStatus = new int[1];
        glGetShaderiv(shaderHandle, GL_COMPILE_STATUS, compileStatus, 0);
        if(compileStatus[0] == 0)
        {
            glDeleteShader(shaderHandle);
            shaderHandle = 0;
            Log.d(TAG, "Compilation of shader failed");
        }
        else
        {
            Log.d(TAG, "Compilation of shader successful");
        }
    }
    if(shaderHandle == 0)
    {
        Log.d(TAG, "Context: "+this.context);
        throw new RuntimeException("Error creating shader");
    }

    return shaderHandle;
}


public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    loadGLTexture(gl, this.context);

    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    gl.glClear(GL10.GL_DEPTH_BUFFER_BIT);
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glDepthFunc(GL10.GL_LEQUAL);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);

    String vertexShaderSource = readTextFileFromResource(this.context, R.raw.vertex_shader);
    String fragmentShaderSource = readTextFileFromResource(this.context, R.raw.fragment_shader);

    shaderProgram = buildProgram(vertexShaderSource, fragmentShaderSource);

}

在尝试调用GL函数时,请确保您具有有效的GL上下文。顶点着色器看起来无效,OpenGL ES没有预定义的
GL\u vertex
变量。但在任何情况下,您都没有显示发生错误的代码,因此无法确定到底出了什么问题。它真的是
glCreateShader()
返回0,还是着色器编译失败?@RetoKoradi在我共享的方法中发生错误,我已检查glCreateShader()中的变量是否为0,如果为0,则抛出RunTimeException,这就是错误显示的位置。我还显示了我尝试编译着色器的位置。关于顶点着色器,我确实尝试查找了一些基本着色器,这是其中之一,但如果它错了,我将如何更正它?@sandmaster:你说错误发生在
编译器着色器中,但你未粘贴其代码。如果
glCreateShader
返回0,则此时您很可能没有有效的GL上下文(调用线程当前有此上下文)。另一个选项是
GL\u OUT\u MEMORY
情况,但后者不太可能。@derhass添加了缺少的内容,希望能有所帮助。