0

OpenGlES2.0に問題があります。OBJファイルを読み込んでAndroidスマートフォンに描画できるように、非常にシンプルなフレームワークを設計しましたが、修正できなかった2つのバグがあります。

  1. 向きを変更してアクティビティがスクレイピングされてリロードされるまで、アプリは何も表示しません。リロードするまでは、GLES20.glClear()のみが表示されます(灰色がかった色に設定しました)。

  2. OBJをロードして方向付けのトリックを実行すると、顔の半分が失われ、ギャップが表示されることがありますが、使用したOBJファイルに問題がある可能性があります。


package com.ideas.opengl;

import java.io.IOException;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLES20;
import android.opengl.GLSurfaceView.Renderer;
import android.opengl.Matrix;

public class DemoRenderer implements Renderer {
    public static int mProgramHandle;
    private int mMVPMatrixHandle;
    private float[] mModelMatrix = new float[16];
    private float[] mViewMatrix = new float[16];
    private float[] mProjectionMatrix = new float[16];
    private float[] mMVPMatrix = new float[16];

    public Object banana;

    private OpenGLDemoActivity activity;

    private int angle;

    public DemoRenderer(OpenGLDemoActivity activity) throws IOException {
        this.activity = activity;
    }



    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config){
        GLES20.glClearColor(0.65f, 0.65f, 0.65f, 0.65f);

        //GLES20.glEnable(GLES20.GL_CULL_FACE);

        GLES20.glEnable(GLES20.GL_DEPTH_TEST);

        GLES20.glEnable(GLES20.GL_TEXTURE_2D);

        Shader shader = null;
        try {
            shader = new Shader(activity, "simple");
        } catch (IOException e) {
            e.printStackTrace();
        }
        Vector position = new Vector();
        Vector speed = new Vector();
        Vector accel = new Vector();
        Model model = null;
        try {
            model = new Model("banana", activity);
        } catch (IOException e) {
            e.printStackTrace();
        }

        banana = new Object(position, speed, accel, model);

        mProgramHandle = shader.getProgramHandle();

        final float eyeX = 0.0f;
        final float eyeY = 0.0f;
        final float eyeZ = 3.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);

        mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_MVPMatrix");
    }

    @Override
    public void onSurfaceChanged(GL10 gl, 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.0f;
        final float top = 1.0f;
        final float near = 1.0f;
        final float far = 10.0f;

        Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far);

    }


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

        angle++;

        Matrix.setIdentityM(mModelMatrix, 0);
        Matrix.rotateM(mModelMatrix, 0, angle, 0.0f, 1.0f, 1.0f);

        Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);

        Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);

        GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);

        banana.draw();
    }
}

`

4

2 に答える 2

1

いくつかの glGetError() を試してみたところ、エラーが発生しました。1 つは値が変更されていない変数に関するもので、もう 1 つは属性が頂点シェーダーで使用されていない場合に glGetAttributeLocation() が -1 を返すことでした。助けてくれてありがとう!

于 2012-06-15T18:28:05.853 に答える
1

ジオメトリの問題は、行列の乗算で入力と出力に同じ float 配列を使用していることが原因である可能性があり Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0); ます。multipleMM() の仕様によると、入力配列と出力配列は重複する要素を持たない可能性がありますが、同じ配列 mMVPMatrix を次のように使用します。同じインデックス 0。問題を修正する 1 つの方法は、最後の乗算の結果のバッファーとして別の行列を使用することです。

Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);

使用する:

Matrix.multiplyMM(mMatrixFinal, 0, mProjectionMatrix, 0, mMVPMatrix, 0);
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMatrixFinal, 0);
于 2016-05-14T17:13:38.357 に答える