0

OpenGL の NeHe チュートリアルの Android ポートであるinsanitydesign.comにあるチュートリアル セットに従っています。チュートリアル バージョンが常に正しくレンダリングされているように見えるのに、変更したバージョンがランダムに完全に正しくレンダリングされない理由を理解するのに多くの問題があります。プログラムをロードするとすぐに問題が明らかになる場合もありますが、表示される前に画面を回転させる必要がある場合もあります。filedropperから、画面を 12 回回転させたスクリーングラブを含む zip ファイルをダウンロードできます。ご覧のとおり、通常、三角形はレンダリングされますが、場合によっては完全に歪んで汚れて表示されます。 興味があれば、ここに私の Eclipse プロジェクト全体へのリンクがあります。

Shape.draw() メソッドに問題があると思われますが、確かなことはわかりません。

これは、関連するコードだと思います:

GLRenderer.java

    private Shape shape;

public GLRenderer(){
    Log.i(this.toString(),"ctor");
    shape = Shape.makeTriangle();
}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    speedPerSecond = SystemClock.uptimeMillis();
    Log.d(this.toString(), ".onSurfaceCreated");

    gl.glShadeModel(GL10.GL_SMOOTH);            



    gl.glClearColor(1.0f, 0.0f, 0.0f, 0.5f);


    gl.glClearDepthf(1.0f);                     //Depth Buffer Setup



    gl.glEnable(GL10.GL_DEPTH_TEST);            //Enables Depth Testing
    gl.glDepthFunc(GL10.GL_LEQUAL);             //The Type Of Depth Testing To Do

    //Really Nice Perspective Calculations
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 

}

@Override
public void onDrawFrame(GL10 gl) {

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();

    shape.setX(0.0f);
    shape.setY(0.0f);
    shape.setZ(-6.0f);
    shape.draw(gl);
}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    if(height == 0){
        height = 1;
    }
    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();


    GLU.gluPerspective(gl, 45.0f, (float)width / (float)height, 0.1f, 50.0f);


    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();


}

Shape.java パッケージ com.smashing.test;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.opengles.GL10;

import android.util.Log;

public class Shape implements IGLShape {

    public float getX(){
        return x;
    }

    public float getY(){
        return y;
    }

    public float getZ(){
        return z;
    }

    public void setX(float pX){
        x = pX;
    }

    public void setY(float pY){
        y = pY;
    }

    public void setZ(float pZ){
        z = pZ;
    }



    public static Shape makeTriangle(){
        Shape s = new Shape();
                /*
                 *  Is this correct?  I want to create a right triangle on screen like this
                 *  |\
                 *  | \
                 *  |  \
                 *  |   \
                 *  |____\  though with a 90/45/45 degree spread rather than this poor representation.
                 */
        float v[] = {
            0.0f, 1.0f, 0.0f,
            0.0f, 0.0f, 0.0f,
            1.0f, 0.0f, 0.0f
        };
        s.setVertices(v);
        return s;
    }

    public static Shape makeShapeFromVertices(float pVerts[]){
        Shape s = new Shape();
        s.setVertices(pVerts);
        return s;   
    }


    private float x = 0.0f;
    private float y = 0.0f;
    private float z = 0.0f;
    private float[] mVertices;
    private FloatBuffer mVertexBuffer;






    public void setVertices(float pVerts[]){
        mVertices = pVerts;
        ByteBuffer bb = ByteBuffer.allocateDirect(mVertices.length * 4);
        bb.order(ByteOrder.nativeOrder());
        mVertexBuffer = bb.asFloatBuffer();
        mVertexBuffer.put(mVertices);
        mVertexBuffer.position(0);
    }

    public float[] getVertices(){
        return mVertices;
    }

    private Shape(){

    }


    @Override
    public void draw(GL10 gl) {


        /*
         * I believe the problem is here... but I don't understand how or why?
         */
        gl.glTranslatef(x, y, z);
        gl.glFrontFace(GL10.GL_CW);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, mVertices.length);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glTranslatef(-x, -y, -z);

    }



}

編集:チュートリアルが私のバージョンとは少し異なることを認識しています。私はそこから推測して実験しようとしています...違いに完全に驚いて驚いており、それらが存在する理由と、レンダリングで見つけたような不快な結果を回避する方法を知りたいです。図式。

4

1 に答える 1

1

交換する必要があります

glDrawArrays(GL10.GL_TRIANGLE_STRIP, ...)

glDrawArrays(GL10.GL_TRIANGLES, ...)

四角形ではなく単純な三角形を描いているので、それが問題の原因だと思います。

よろしく

于 2011-03-25T16:14:20.547 に答える