Android HelloOpenGLES20 示例不起作用

标签 android opengl-es background drawing

我一直在尝试做 android dev-guide on OPENGLES20 , 但是当我运行代码时,我只绘制了背景颜色,而不是三角形(直到拉伸(stretch)三角形照片我才完成)。

如何让三角形显示出来? (在 Android 2.2 设备上运行应用程序)

代码如下:

public class HelloOpenGLES20Renderer implements Renderer {
private FloatBuffer triangleVB;

private final String vertexShaderCode = "attribute vec4 vPosition; \n"
        + "void main(){              \n" + " gl_Position = vPosition; \n"
        + "}                         \n";

private final String fragmentShaderCode = "precision mediump float;  \n"
        + "void main(){              \n"
        + " gl_FragColor = vec4 (0.63671875, 0.76953125, 0.22265625, 1.0); \n"
        + "}                         \n";

private int mProgram;
private int maPositionHandle;

private int loadShader(int type, String shaderCode) {

    // create a vertex shader type (GLES20.GL_VERTEX_SHADER)
    // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
    int shader = GLES20.glCreateShader(type);

    // add the source code to the shader and compile it
    GLES20.glShaderSource(shader, shaderCode);
    GLES20.glCompileShader(shader);

    return shader;
}

@Override
public void onDrawFrame(GL10 gl) {
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

    GLES20.glUseProgram(mProgram);

    GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT,
            false, 12, triangleVB);
    GLES20.glEnableVertexAttribArray(maPositionHandle);

    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
}

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

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    initShapes();
    int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
    int fragmentShader = loadShader(GLES20.GL_VERTEX_SHADER,
            fragmentShaderCode);
    mProgram = GLES20.glCreateProgram();
    GLES20.glAttachShader(mProgram, vertexShader);
    GLES20.glAttachShader(mProgram, fragmentShader);
    GLES20.glLinkProgram(mProgram);

    maPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
}

private void initShapes() {
    float[] triangleCoords = new float[] {
            // X,Y,Z
            -0.5f, -0.25f, 0, 0.5f, -0.25f, 0, 0.0f, 0.559016994f, 0 };
    ByteBuffer vbb = ByteBuffer.allocateDirect(triangleCoords.length * 4);
    vbb.order(ByteOrder.nativeOrder());
    triangleVB = vbb.asFloatBuffer();
    triangleVB.put(triangleCoords);
    triangleVB.position(0);
}

最佳答案

我认为您没有 100% 正确地遵循教程。例如,在 onSurfaceCreated(...) 中,您调用 loadShader(GLES20.GL_VERTEX_SHADER..) 两次,而后者应该是 loadShader(GLES20.GL_FRAGMENT_SHADER..)

关于Android HelloOpenGLES20 示例不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8673076/

相关文章:

java - StartActivityForResult 从 MVVM 架构中的图库中获取图像?

android - 仅对 LG 设备使用 adb 方法的设备所有者问题

ios - iPad 纹理加载差异(32 位与 64 位)

css - 背景 VS 背景颜色 : performance

android - 在不同的 ViewFlipper View 上重新计算 ScrollView?

android - Android 上的 Facebook 或 Instagram 应用程序未显示 Font-Awesome

android - setEGLConfigChooser() 中的 "depthSize"和 "stencilSize"是什么意思?

opengl-es - OpenGL ES 2.0 和 OpenGL ES 3.0 有什么区别

css - 一个 div 可以有一个背景图像,但重复不同的图像吗?

android - ImageView背景onclick