java - Kevin Brothaler OpenGL ES 2教程代码有错?

标签 java android opengl-es-2.0

我有一个 book “Pragmatic OpenGL ES 2 for Android”,作者:Kevin Brothaler。我刚开始阅读它并做教程。

在第 4 章关于添加颜色和阴影的教程之前,一切都很好。

所以第 3 章代码是 here (有很多东西所以我添加了一个链接)。 一切都很好。

在第 4 章中,我们正在改变绘制这些东西的方式和着色器。

而且只有黑屏而不是这么好的画面 enter image description here

首先,我们改变了着色器

顶点着色器

attribute vec4 a_Position;

attribute vec4 a_Color;
varying vec4 v_Color;
void main()
{
    v_Color = a_Color;

    gl_Position = a_Position;
    gl_PointSize = 10.0;
}

帧着色器

precision mediump float;
varying vec4 v_Color;

void main(){
     gl_FragColor = v_Color;
}

我们还在 Render 类中添加了新内容并删除了一些内容。

变量

private static final int POSITION_COMPONENT_COUNT=2;
private static final int BYTES_PER_FLOAT=4;
private static final String A_COLOR="a_Color";
private static final int COLOR_COMPONENT_COUNT=3;
private static final int STRIDE = (POSITION_COMPONENT_COUNT+COLOR_COMPONENT_COUNT)*BYTES_PER_FLOAT;

private int aColorLocation;

以这种方式改变方法(thats 之前是怎样的)

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // TODO Auto-generated method stub
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

        String vertexShaderSource = TextResourceReader.readTextFileFromResource(context,  R.raw.simple_vertex_shader);
        String fragmentShaderSource = TextResourceReader.readTextFileFromResource(context, R.raw.simple_fragment_shader);
        int vertexShader = ShaderHelper.compileVertexShader(vertexShaderSource);
        int fragmentShader = ShaderHelper.compileFragmentShader(fragmentShaderSource);
        program = ShaderHelper.linkProgram(vertexShader, fragmentShader);

        if(LoggerConfig.ON){
            ShaderHelper.validateProgram(program);
        }

        glUseProgram(program);

        aPositionLocation = glGetAttribLocation(program, A_POSITION);

        aColorLocation = glGetAttribLocation(program, A_COLOR);



        vertexData.position(0);

        glVertexAttribPointer(aPositionLocation,POSITION_COMPONENT_COUNT,GL_FLOAT,
                false, STRIDE, vertexData);

        glEnableVertexAttribArray(aColorLocation);

        vertexData.position(POSITION_COMPONENT_COUNT);

        glVertexAttribPointer(aColorLocation, COLOR_COMPONENT_COUNT,GL_FLOAT,
                false,STRIDE,vertexData);


    }

@Override
public void onDrawFrame(GL10 gl) {
    // TODO Auto-generated method stub
    glClear(GL_COLOR_BUFFER_BIT);

    glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 6);

    //с 6, 2 пары
    glDrawArrays(GL_LINES,6,2);
    //Draw the first mallet blue.

    glDrawArrays(GL_POINTS,8,1);
    //Draw the second mallet red.
    glDrawArrays(GL_POINTS,9,1);


}

public AirHockeyRenderer(Context context){

    this.context=context;


    float[] tableVerticesWithTriangles={
            //TriangleFan
            0f, 0f, 1f, 1f, 1f,
            -0.5f,-0.5f, 0.7f, 0.7f, 0.7f,
            0.5f,-0.5f, 0.7f, 0.7f, 0.7f,
            0.5f, 0.5f, 0.7f, 0.7f, 0.7f,
            -0.5f, 0.5f, 0.7f, 0.7f, 0.7f,
            -0.5f,-0.5f, 0.7f, 0.7f, 0.7f,

            //Line1
            -0.5f,0f,1f, 0f, 0f,
            0.5f,0f, 1f, 0f, 0f,
            //Mallets
            0f,-0.25f,0f,0f,1f,
            0f, 0.25f,1f,0f,0f
    };





    vertexData=ByteBuffer
            .allocateDirect(tableVerticesWithTriangles.length*BYTES_PER_FLOAT)
            .order(ByteOrder.nativeOrder())
            .asFloatBuffer();


    vertexData.put(tableVerticesWithTriangles);


}

怎么了?为什么会出现黑屏?也许我错过了什么?

完整的 repo 是 here

更新: 我跑 this实际代码

UPD2:

Reto Koradi 注意到我忘记在代码中添加 glEnableVertexAttribArray(aPositionLocation);。 我添加了它,现在有一个白色像素的黑屏 white pixel

更新 3: last updates are here

UPD4: 输出错误!

[2014-08-21 18:17:00 - Emulator] sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glAttachShader:156 error 0x501 [2014-08-21 18:17:00 - Emulator] sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glValidateProgram:1931 error 0x501 [2014-08-21 18:17:00 - Emulator] sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetProgramiv:1148 error 0x501 [2014-08-21 18:17:00 - Emulator] sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetProgramiv:1148 error 0x501 [2014-08-21 18:17:00 - Emulator] sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetAttribLocation:825 error 0x501 [2014-08-21 18:17:00 - Emulator] sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetAttribLocation:825 error 0x501

最佳答案

我唯一看不到的是代码从不启用位置顶点属性。此调用应在 onSurfaceCreated() 中,其中设置了顶点属性:

glEnableVertexAttribArray(aPositionLocation);

关于java - Kevin Brothaler OpenGL ES 2教程代码有错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25348958/

相关文章:

java ews api - 网络凭据?

java - sqlite 数据库返回空对象引用

android - 一个 View 上有两个独立的屏幕

android.grapics.matrix 到 OpenGL 2.0 ES 纹理转换

android - 我应该单独存储变换矩阵吗?

java - 了解 FlateDecode 编码的 PDF 流

java - 在注解出现之前,Java 程序员是如何生存的?

java - Jasper Report 中有子报表时,JRException 找不到资源

java - 通过netbeans启动android应用程序

opengl - 优化渲染是否需要从前到后绘制?