Java 纹理不起作用

Java 纹理不起作用,java,android,opengl-es,opengl-es-2.0,Java,Android,Opengl Es,Opengl Es 2.0,你好,我正在尝试渲染两个三角形的纹理glGetError()不返回任何错误。我可以渲染彩色矩形,但纹理不起作用。着色器的编译没有错误。为什么这个代码不起作用?() 我至少可以看到(在顶点和片段着色器中)只使用“vec2 texturePosition”,而应该使用“Variable”作为从顶点着色器到片段着色器的输出。尝试在着色器中的“vec2…”之前添加“variable” class MainRenderer implements GLSurfaceView.Renderer { i

你好,我正在尝试渲染两个三角形的纹理
glGetError()
不返回任何错误。我可以渲染彩色矩形,但纹理不起作用。着色器的编译没有错误。为什么这个代码不起作用?()


我至少可以看到(在顶点和片段着色器中)只使用“vec2 texturePosition”,而应该使用“Variable”作为从顶点着色器到片段着色器的输出。尝试在着色器中的“vec2…”之前添加“variable”

class MainRenderer implements GLSurfaceView.Renderer {
    int vertexBuffer;
    int indexBuffer;
    int shaderProgram;
    int texture;

    @Override
    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        GLES20.glClearColor(1, 0, 0, 1);

        int[] textures = new int[1];
        GLES20.glGenTextures(1, textures, 0);
        texture = textures[0];
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, BitmapFactory.decodeResource(MainActivity.MainActivityHandle.getResources(), R.drawable.pes), 0);

        float vertices[] = {
                1, 1,
                1, 0,
                0, 0,
                0, 1
        };
        int indices[] = {
                0, 1, 3,
                1, 2, 3
        };
        String vertexShaderCode = "attribute vec2 position;  vec2 texturePosition; void main(){texturePosition = position;gl_Position = vec4(position,0.0, 1.0);}";
        String fragmentShaderCode = "precision mediump float;uniform sampler2D texture; vec2 texturePosition; void main(){gl_FragColor = texture2D(texture, texturePosition);}";

        int vertexBuffers[] = new int[1];
        GLES20.glGenBuffers(1, vertexBuffers, 0);
        vertexBuffer = vertexBuffers[0];
        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBuffer);
        GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, 4 * 2 * 4, FloatBuffer.wrap(vertices), GLES20.GL_STATIC_DRAW);

        int indexBuffers[] = new int[1];
        GLES20.glGenBuffers(1, indexBuffers, 0);
        indexBuffer = indexBuffers[0];
        GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
        GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, 2 * 3 * 4, IntBuffer.wrap(indices), GLES20.GL_STATIC_DRAW);

        int vertexShader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
        GLES20.glShaderSource(vertexShader, vertexShaderCode);
        GLES20.glCompileShader(vertexShader);

        int fragmentShader = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
        GLES20.glShaderSource(fragmentShader, fragmentShaderCode);
        GLES20.glCompileShader(fragmentShader);

        shaderProgram = GLES20.glCreateProgram();
        GLES20.glAttachShader(shaderProgram, vertexShader);
        GLES20.glAttachShader(shaderProgram, fragmentShader);
        GLES20.glLinkProgram(shaderProgram);
    }

    @Override
    public void onSurfaceChanged(GL10 unused, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
    }

    @Override
    public void onDrawFrame(GL10 unused) {
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

        GLES20.glUseProgram(shaderProgram);

        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBuffer);
        GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture);

        int positionAttributeHandle = GLES20.glGetAttribLocation(shaderProgram, "position");
        GLES20.glEnableVertexAttribArray(positionAttributeHandle);
        GLES20.glVertexAttribPointer(positionAttributeHandle, 2, GLES20.GL_FLOAT, false, 2*4, 0);

        GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_INT, 0);

        GLES20.glDisableVertexAttribArray(positionAttributeHandle);
    }
}