Kevin Brothaler OpenGL ES 2教程代码错了?

时间:2014-08-17 11:55:03

标签: java android opengl-es-2.0

我得到了Kevin Brothaler的book“实用的OpenGL ES 2 for Android”。我刚开始阅读它并做教程。

在第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;
}

Frament shader

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);


}

什么错了?为什么有黑屏?也许我错过了什么?

完整回购是here

UPD: 我实际运行this代码

UPD2:

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

UPD3: last updates are here

UPD4: 输出错误!

  

[2014-08-21 18:17:00 - 模拟器]   SDK /仿真器/的OpenGL /主机/库/翻译/ GLES_V2 / GLESv2Imp.cpp:glAttachShader:156   错误0x501 [2014-08-21 18:17:00 - 模拟器]   SDK /模拟器/ OpenGL的/主机/库/转换器/ GLES_V2 / GLESv2Imp.cpp:glValidateProgram:1931年   错误0x501 [2014-08-21 18:17:00 - 模拟器]   SDK /模拟器/ OpenGL的/主机/库/转换器/ GLES_V2 / GLESv2Imp.cpp:glGetProgramiv:1148   错误0x501 [2014-08-21 18:17:00 - 模拟器]   SDK /模拟器/ OpenGL的/主机/库/转换器/ GLES_V2 / GLESv2Imp.cpp:glGetProgramiv:1148   错误0x501 [2014-08-21 18:17:00 - 模拟器]   SDK /模拟器/ OpenGL的/主机/库/转换器/ GLES_V2 / GLESv2Imp.cpp:glGetAttribLocation:825   错误0x501 [2014-08-21 18:17:00 - 模拟器]   SDK /模拟器/ OpenGL的/主机/库/转换器/ GLES_V2 / GLESv2Imp.cpp:glGetAttribLocation:825   错误0x501

2 个答案:

答案 0 :(得分:2)

我唯一缺少的是代码永远不会启用位置顶点属性。此调用应位于onSurfaceCreated(),其中设置了顶点属性:

glEnableVertexAttribArray(aPositionLocation);

答案 1 :(得分:1)

glEnableVertexAttribArray(aColorLocation);移至glVertexAttribPointer(aColorLocation, COLOR_COMPONENT_COUNT,GL_FLOAT, false,STRIDE,vertexData);以下 并将其替换为glEnableVertexAttribArray(aPositionLocation)

中的OnSurfaceCreate

这就像下面的

vertexData.position(0);
        glVertexAttribPointer(aPositionLocation,POSITION_COMPONENT_COUNT,GL_FLOAT,false,STRIDE,vertexData);
        glEnableVertexAttribArray(aPositionLocation);

        vertexData.position(POSITION_COMPONENT_COUNT);
        glVertexAttribPointer(aColorLocation,COLOR_COMPONENT_COUNT,GL_FLOAT,false,STRIDE,vertexData);
        glEnableVertexAttribArray(aColorLocation);