java - 为什么这不能形成一个好看的正方形?

标签 java android opengl-es opengl-es-2.0

好吧,首先我完全同意“TheNewBoston”教程有时是非常......错误的。然而,这就是我尝试在 Android 上用 OpenGL 制作立方体的尝试。

无论如何,老实说我不能说我已经找到了有关 OpenGL 的优秀 Material 。我已经通读了 OpenGL Superbible...还可以。

这是我的代码。

GLRenderer.java

package android.gem.opengltest;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLU;
import android.opengl.GLSurfaceView.Renderer;
import android.os.SystemClock;

public class GLRenderer implements Renderer {

    private GLCube cube;

    public GLRenderer() {
        cube = new GLCube();
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        // TODO Auto-generated method stub
        gl.glDisable(GL10.GL_DITHER);
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT | GL10.GL_STENCIL_BUFFER_BIT);

        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
        GLU.gluLookAt(gl, 0, 0, -5, 0, 0, 0, 0, 2, 0);

        long time = SystemClock.uptimeMillis() % 4000L;
        float angle = .09f * ((int) time);

        gl.glRotatef(angle, 1, 1.5f, 2);

        cube.draw(gl);
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        // TODO Auto-generated method stub
        float ratio = (float) width / height;

        gl.glViewport(0, 0, width, height);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 25);
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig eglConfig) {
        // TODO Auto-generated method stub

        // START OF PERFORMANCE //
        gl.glDisable(GL10.GL_DITHER);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
        // END OF PERFORMANCE //

        gl.glClearColor(.8f, 0, .2f, 1f);  // Red, Green, Blue, Alpha (0 - 1)
        gl.glClearDepthf(1f);
    }

}

GLCube.java

package android.gem.opengltest;

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

import javax.microedition.khronos.opengles.GL10;

public class GLCube {

    private float verticies[] = {
            1, 1, -1, // point 0 - topFrontRight
            1, -1, -1, // point 1 - bottomFrontRight
            -1, -1, -1, // point 2 - bottomFrontLeft
            -1, 1, -1, // point 3 - frontTopLeft
            1, 1, 1, // point 4 - topBackRight
            1, -1, 1, // point 5 - bottomBackRight
            -1, -1, 1, // point 6 - bottomBackLeft
            -1, 1, 1 // point 7 - frontBackLeft
    };

    private float rgbaValues[] = {
             1, 1, 0, 1,
             .25f, 0, .85f, 1,
             0, 1, 1, 1,
             1, 1, 0, 1,
             .25f, 0, .85f, 1,
             0, 1, 1, 1,
             .5f, .5f, .2f, 1,
             .3f, .3f, .3f, 1
    };

    private FloatBuffer vertBuff, colorBuff;

    private short[] pIndex = {  // Indicies
            3, 4, 0,  0, 4, 1,  3, 0, 1,
            3, 7, 4,  7, 6, 4,  7, 3, 6,
            3, 1, 2,  1, 6, 2,  6, 3, 2,
            1, 4, 5,  5, 6, 1,  6, 5, 4
    };

    private ShortBuffer pBuffer;

    public GLCube() {
        ByteBuffer bBuff = ByteBuffer.allocateDirect(this.verticies.length * 4);
        bBuff.order(ByteOrder.nativeOrder());
        vertBuff = bBuff.asFloatBuffer();
        vertBuff.put(this.verticies);
        vertBuff.position(0);

        ByteBuffer pbBuff = ByteBuffer.allocateDirect(this.pIndex.length * 2);
        pbBuff.order(ByteOrder.nativeOrder());
        pBuffer = pbBuff.asShortBuffer();
        pBuffer.put(pIndex);
        pBuffer.position(0);

        ByteBuffer cBuff = ByteBuffer.allocateDirect(this.rgbaValues.length * 4);
        cBuff.order(ByteOrder.nativeOrder());
        colorBuff = cBuff.asFloatBuffer();
        colorBuff.put(rgbaValues);
        colorBuff.position(0);
    }

    public void draw(GL10 gl) {
        gl.glFrontFace(GL10.GL_CW); // Clock Wise
        gl.glEnable(GL10.GL_CULL_FACE);  // Removes back end of cube
        gl.glCullFace(GL10.GL_BACK);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, this.vertBuff);
        gl.glColorPointer(4, GL10.GL_FLOAT, 0, this.colorBuff);
        gl.glDrawElements(GL10.GL_TRIANGLES, this.pIndex.length, GL10.GL_UNSIGNED_SHORT, this.pBuffer);

        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDisable(GL10.GL_CULL_FACE);
    }

}

我得到一个看起来像这样的立方体......

enter image description here

我做错了什么?我应该怎样做才能使它看起来像一个真正的立方体?

另外,如果有帮助的话,我的所有代码都位于以下地址:https://github.com/gemurdock/OpenGlTest/tree/alpha.0.1.0

最佳答案

首先,这是一个(严重变形)立方体,不是正方形。除非你正面看它,否则它永远不会看起来像一个“好方 block ”:)

您的多边形面剔除似乎剔除了立方体面的错误一侧。它看起来仍然像一个立方体,只是一个从里到外的立方体。

这可能是因为您覆盖了 OpenGL 的默认正面缠绕方向 (GL_CCW)。

关于java - 为什么这不能形成一个好看的正方形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18433476/

相关文章:

android - 跨平台项目中OpenGL绘图代码在哪里?规划我的引擎代码

Android:在 GLSurfaceView 中创建纹理会从标准硬件加速 View 元素中删除纹理

android - 无法使用纹理

java - For循环前进两个数字而不是一个

android - 我应该在长时间运行的 AsyncTask 中使用 getApplicationContext 还是 Activity.this

java - IntentService 中的 ExecutorService。会被安卓干掉吗?

android - 未经检查的对 ArrayAdapter super 的调用

android - 将 PanoramaApi 与 Assets 文件夹中的自定义等距柱状图像一起使用

java - 在 getString 中转换 localDate 时出错

java - XSL XML 到 CSV 位置编号