0

我一直在关注http://www.learnopengles.com/android-lesson-one-getting-started/上的 OpenGL ES 教程,并确保它与给出的示例一致,但由于某种原因,编译器是为 LessonOneRenderer 类中的每个重写方法提供错误。当我为它们中的每一个去掉@Override 时,它​​们根本不会被调用,并且程序会显示一个空白屏幕。

为什么这个类不能从其实现的接口中识别方法?

LessonOneRenderer

package com.aft.glone;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.Matrix;
import android.os.SystemClock;

public class LessonOneRenderer implements GLSurfaceView.Renderer {
private final FloatBuffer mTriangle1Vertices;
//private final FloatBuffer mTriangle2Vertices;
//private final FloatBuffer mTriangle3Vertices;
private int mMVPMatrixHandle;
private int mPositionHandle;
private int mColorHandle;

private final int mBytesPerFloat=4;

private float[] mViewMatrix = new float[16];
private float[] mProjectionMatrix = new float[16];
private float[] mModelMatrix = new float[16];
private float[] mMVPMatrix = new float[16];

private final int mStrideBytes = 7 * mBytesPerFloat;
private final int mPositionOffset = 0;
private final int mPositionDataSize = 3;
private final int mColorOffset = 3;
private final int mColorDataSize = 4;

public LessonOneRenderer()
{
    final float[] triangle1VerticesData = {
        //X, Y, Z
        //R, G, B, A
        -0.5f, -0.25f, 0.0f,
        1.0f, 0.0f, 0.0f, 1.0f,

        0.5f, -0.25f, 0.0f,
        0.0f, 0.0f, 1.0f, 1.0f,

        0.0f, 1.559016994f, 0.0f,
        0.0f, 1.0f, 0.0f, 1.0f
};

mTriangle1Vertices = ByteBuffer.allocateDirect(triangle1VerticesData.length *       mBytesPerFloat)
        .order(ByteOrder.nativeOrder()).asFloatBuffer();

mTriangle1Vertices.put(triangle1VerticesData).position(0);
}

@Override
public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
{
GLES20.glClearColor(0.5f, 0.5f, 0.5f, 0.5f);
final float eyeX = 0.0f;
final float eyeY = 0.0f;
final float eyeZ = 1.5f;

final float lookX = 0.0f;
final float lookY = 0.0f;
final float lookZ = -5.0f;

final float upX = 0.0f;
final float upY = 1.0f;
final float upZ = 0.0f;

Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);

final String vertexShader =
        "uniform mat4 u_MVPMatrix;  \n"
        + "attribute vec4 a_Position;   \n"
        + "attribute vec4 a_Color;  \n"
        + "varying vec4 v_Color;    \n"
        + "void main()  \n"
        + "{    \n"
        + " v_Color = a_Color;  \n"
        + " gl_Position = u_MVPMatrix * a_Position; \n"
        + "}    \n";
final String fragmentShader = 
        "precision mediump float;   \n"
        + "varying vec4 v_Color;    \n"
        + "void main()  \n"
        + "{    \n"
        + " gl_FragColor = v_Color; \n"
        + "}    \n";

int vertexShaderHandle = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);
if (vertexShaderHandle != 0)
{
    GLES20.glShaderSource(vertexShaderHandle, vertexShader);
    GLES20.glCompileShader(vertexShaderHandle);
    final int[] compileStatus = new int[1];
    GLES20.glGetShaderiv(vertexShaderHandle, GLES20.GL_COMPILE_STATUS, compileStatus, 0);
    if (compileStatus[0] == 0)
    {
        GLES20.glDeleteShader(vertexShaderHandle);
        vertexShaderHandle = 0;
    }
}

if (vertexShaderHandle == 0)
{
    throw new RuntimeException("Error creating vertex shader.");
}

int fragmentShaderHandle = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);

if (fragmentShaderHandle != 0)
{
    GLES20.glShaderSource(fragmentShaderHandle, fragmentShader);
    GLES20.glCompileShader(fragmentShaderHandle);
    final int[] compileStatus = new int[1];
    GLES20.glGetShaderiv(fragmentShaderHandle, GLES20.GL_COMPILE_STATUS, compileStatus, 0);
    if (compileStatus[0] == 0)
    {
        GLES20.glDeleteShader(fragmentShaderHandle);
        fragmentShaderHandle = 0;
    }
}

if (fragmentShaderHandle == 0)
{
    throw new RuntimeException("Error creating fragment shader.");
}

int programHandle = GLES20.glCreateProgram();
if (programHandle != 0)
{
    GLES20.glAttachShader(programHandle, vertexShaderHandle);
    GLES20.glAttachShader(programHandle, fragmentShaderHandle);
    GLES20.glBindAttribLocation(programHandle, 0, "a_Position");
    GLES20.glBindAttribLocation(programHandle,  1, "a_Color");
    GLES20.glLinkProgram(programHandle);
    final int[] linkStatus = new int[1];
    GLES20.glGetProgramiv(programHandle, GLES20.GL_LINK_STATUS, linkStatus, 0);
    if (linkStatus[0] == 0)
    {
        GLES20.glDeleteProgram(programHandle);
        programHandle = 0;
    }
}

if (programHandle == 0)
{
    throw new RuntimeException("Error creating program.");
}

mMVPMatrixHandle = GLES20.glGetUniformLocation(programHandle, "u_MVPMatrix");
mPositionHandle = GLES20.glGetAttribLocation(programHandle, "a_Position");
mColorHandle = GLES20.glGetAttribLocation(programHandle, "a_Color");
GLES20.glUseProgram(programHandle);
}

@Override
public void onSurfaceChanged(GL10 glUnused, int width, int height)
{
GLES20.glViewport(0,  0, width, height);
final float ratio = (float)width/height;
final float left = -ratio;
final float right = ratio;
final float bottom = -1;
final float top = 1;
final float near = 1;
final float far = 10;
Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far);
}

@Override
public void onDrawFrame(GL10 glUnused)
{
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
long time = SystemClock.uptimeMillis() % 10000L;
float angleInDegrees = (360.0f / 10000.0f) * ((int)time);
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.rotateM(mModelMatrix, 0, angleInDegrees, 0.0f, 0.0f, 1.0f);
drawTriangle(mTriangle1Vertices);
 }

private void drawTriangle(final FloatBuffer aTriangleBuffer)
{
aTriangleBuffer.position(mPositionOffset);
GLES20.glVertexAttribPointer(mPositionHandle, mPositionDataSize, GLES20.GL_FLOAT, false,
        mStrideBytes, aTriangleBuffer);
GLES20.glEnableVertexAttribArray(mPositionHandle);
aTriangleBuffer.position(mColorOffset);
GLES20.glVertexAttribPointer(mColorHandle, mColorDataSize, GLES20.GL_FLOAT, false,
        mStrideBytes, aTriangleBuffer);
GLES20.glEnableVertexAttribArray(mColorHandle);
Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
}
}
4

2 回答 2

0

Perhaps you need to import android.opengl.GLSurfaceView.Renderer; ?

I'm not sure if that's needed if you import GLSurfaceView, but I checked on my own renderer and it includes that import.

于 2012-06-12T00:09:38.783 回答
0

切换到 Java 编译器版本 1.6 应该可以修复编译错误,但没有 @Override 不应该阻止调用方法,至少只要您从 Activity 调用 GLSurfaceView 上的 setRenderer(...)。

于 2012-06-13T23:13:40.410 回答