1

我是 GLES 2.0 的新手。这真的让我很紧张,因为 OpenGL ES 1 II 只是设置了 GL_LIGHTNING1,然后设置了光照。在 GLES 2.0 中它不起作用。实际上整个屏幕都是黑色的。所以请告诉我应该如何处理下面的代码。这些是我设置的顶点:

        static float quadrateCoords[] = { // in counterclockwise order:
    // front
    -0.5f, -0.5f, 0.5f,
     0.5f, -0.5f, 0.5f,
    -0.5f, 0.5f, 0.5f,
     0.5f, 0.5f, 0.5f,
    // back
    -0.5f, -0.5f, -0.5f,
     0.5f, -0.5f, -0.5f,
    -0.5f, 0.5f, -0.5f,
     0.5f, 0.5f, -0.5f,
    // left
    -0.5f, -0.5f, 0.5f,
    -0.5f, -0.5f, -0.5f,
    -0.5f, 0.5f, 0.5f,
    -0.5f, 0.5f, -0.5f,
    // right  
     0.5f, -0.5f, 0.5f,
     0.5f, -0.5f, -0.5f,
     0.5f, 0.5f, 0.5f,
     0.5f, 0.5f, -0.5f,  
    // up  
    -0.5f, 0.5f, 0.5f,
     0.5f, 0.5f, 0.5f,
    -0.5f, 0.5f, -0.5f,
     0.5f, 0.5f, -0.5f,
    // bottom  
    -0.5f, -0.5f, 0.5f,
     0.5f, -0.5f, 0.5f,
    -0.5f, -0.5f, -0.5f,
     0.5f, -0.5f, -0.5f
};
static float normal[] = {
    0.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f,

    0.0f, 0.0f, -1.0f,
    0.0f, 0.0f, -1.0f,
    0.0f, 0.0f, -1.0f,
    0.0f, 0.0f, -1.0f,

    -1.0f, 0.0f, 0.0f,
    -1.0f, 0.0f, 0.0f,
    -1.0f, 0.0f, 0.0f,
    -1.0f, 0.0f, 0.0f,

    1.0f, 0.0f, 0.0f,
    1.0f, 0.0f, 0.0f,
    1.0f, 0.0f, 0.0f,
    1.0f, 0.0f, 0.0f,

    0.0f, 1.0f, 0.0f,
    0.0f, 1.0f, 0.0f,
    0.0f, 1.0f, 0.0f,
    0.0f, 1.0f, 0.0f,

    0.0f, -1.0f, 0.0f,      
    0.0f, -1.0f, 0.0f,      
    0.0f, -1.0f, 0.0f,      
    0.0f, -1.0f, 0.0f       
};

static float quadrateColors[] = { // in counterclockwise order:
    // front
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,

    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,

    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,

    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,

    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,

    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f
};

着色器代码是:

        private final String vertexShaderCode =
        "uniform mat4 uMVPMatrix;\n" +
        "uniform mat4 uMVMatrix;\n" +
        "uniform vec3 uLightPos;\n" +

        "attribute vec4 aPosition;\n" +
        "attribute vec4 aColor;\n" +
        "attribute vec4 aNormal;\n" +

        "varying vec4 vColor;\n" +

        "void main() {\n" +
            "vec3 modelViewVertex = vec3(uMVMatrix * a_Position);\n" +
            "vec3 modelViewNormal = vec3(uMVMatrix * vec4(aNormal, 0.0));\n" +
            "float distance = length(uLightPos - modelViewVertex);\n" +
            "vec3 lightVector = normalize(uLightPos - modelViewVertex);\n" +
            "float diffuse = max(dot(modelViewNormal,lightVector), 0.1):\n" + 
            "diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance * distance)));\n" +

            "vColor = aColor * diffuse;\n" + 

            "gl_Position = aPosition * uMVPMatrix;\n" +
        "}\n";

private final String fragmentShaderCode =
        "precision mediump float;\n" +

        "varying vec4 vColor;\n" +

        "void main() {\n" +
            "gl_FragColor = vColor;\n" +
        "}\n";

最后绘制函数:

        public void draw(float[] mvpMatrix, float[] mVMatrix) {
    // Add program to OpenGL environment
    GLES20.glUseProgram(mProgram);

    // get handle to vertex shader's aPosition member
    mPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
    nNormalHandle = GLES20.glGetAttribLocation(mProgram, "aNormal");
    nColorHandle = GLES20.glGetAttribLocation(mProgram, "aColor");

    // Enable a handle to the triangle vertices
    // Prepare the triangle coordinate data
    GLES20.glEnableVertexAttribArray(mPositionHandle);
    GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer);

    GLES20.glEnableVertexAttribArray(nNormalHandle);
    GLES20.glVertexAttribPointer(nNormalHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer2);

    GLES20.glEnableVertexAttribArray(nColorHandle);
    GLES20.glVertexAttribPointer(nColorHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer3);

    muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
    GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mvpMatrix, 0);        

    muMVMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVMatrix");
    GLES20.glUniformMatrix4fv(muMVMatrixHandle, 1, false, mVMatrix, 0);        

    muLightPosHandle = GLES20.glGetUniformLocation(mProgram, "uLightPos");
    GLES20.glUniform3f(muLightPosHandle, 10.0f, 10.0f, 15.0f);

    // Front
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);

    // Back
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 4, 4);

    // Left
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 8, 4);

    // Right
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 12, 4);

    // Top
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 16, 4);

    // Right
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 20, 4);

    // Disable vertex array
    GLES20.glDisableVertexAttribArray(mPositionHandle);
}    
4

2 回答 2

1

像这样调试: gl_FragColor = vec4(0.5, 0, 0, 0.5) + vColor;

找到错误(如果有),尽管您的着色器是正确的。

如果在测试错误后仍然存在错误(直接使用颜色代替自定义值),请查看此 ADS 着色器

如何在 OpenGLES 1.x 中实现阴影(在 iPhone 上)

还有一点要记住,如果您启用了剔除,请禁用它

于 2012-08-05T16:31:01.813 回答
0

您正在尝试在投影空间向量 ( newNormal) 和世界空间向量 ( lightPos) 之间进行点积。

要执行点积,两个向量必须在相同的坐标空间中。在世界空间坐标中提供法线 ( modelMatrix * aNormal),或者在投影空间中提供 lightPos ( viewProjectionMatrix * lightPos)。

于 2012-07-21T16:39:34.833 回答