GL_TRIANGLES的问题

时间:2011-06-11 08:52:51

标签: android opengl-es

我正在开发一个根据用户输入绘制多边形的程序。 我在使用GL_TRIANGLE绘制三角形时遇到问题。我使用下面相同的代码绘制正方形,它运作良好。 Hovewer,如果我只想绘制一个三角形则不起作用。

任何人都可以帮助我吗?

public class Triangle扩展Shape {

private FloatBuffer vertexBuffer;
private FloatBuffer _colorBuffer;
private ShortBuffer indexBuffer;

private float vertices[] = {
        -0.5f, -0.5f, 0.5f, // 0
           0.5f, -0.5f, 0.5f, // 1
           0f, -0.5f, -0.5f, // 2

    }; 

private short[] indices = { 0, 2, 1 };

float[] colors = {1f, 1f, 0f, 1f };



public Triangle() {

    ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
    vbb.order(ByteOrder.nativeOrder());
    vertexBuffer = vbb.asFloatBuffer();
    vertexBuffer.put(vertices);
    vertexBuffer.position(0);


    ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
    ibb.order(ByteOrder.nativeOrder());
    indexBuffer = ibb.asShortBuffer();
    indexBuffer.put(indices);
    indexBuffer.position(0);

    ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length * 4);
    cbb.order(ByteOrder.nativeOrder());
    _colorBuffer = cbb.asFloatBuffer();
    _colorBuffer.put(colors);
    _colorBuffer.position(0);
}


public void draw(GL10 gl) {

    gl.glFrontFace(GL10.GL_CCW); 
    gl.glEnable(GL10.GL_CULL_FACE); 
    gl.glCullFace(GL10.GL_BACK); 


    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0,  vertexBuffer);
    gl.glColorPointer(4, GL10.GL_FLOAT, 0, _colorBuffer);
    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,GL10.GL_UNSIGNED_SHORT, indexBuffer);

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

}

编辑:

我从这里打电话给我的Triangle课程,也许我在这里犯了错误

公共类OpenGLRenderer实现Renderer {        字符串名称;        ArrayList myArr;     私人浮动角度,x,y,z;

public OpenGLRenderer(String nm ) {
      name =nm;
      myArr = new ArrayList<Shape>();
     x=0;
    y=0;
    z=-3;

}


@Override
public void onDrawFrame(GL10 gl) {
    //clear the screen and depth buffer

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

    gl.glTranslatef(x, y, z);

     for (Shape t : myArr)
     {
         if (t instanceof Rectangle)
     { 
            // gl.glTranslatef(0, 0, -4);

             ((Rectangle )t).draw(gl);
             }
         if (t instanceof Square)
         { //gl.glTranslatef(0, 1, 0);
             ((Square )t).draw(gl);}
         if (t instanceof Pyramid){
             ((Pyramid)t).draw(gl);

        if (t instanceof Triangle){
            ((Triangle)t).draw(gl);

        }
        if (t instanceof Line){
            ((Line)t).draw(gl);
        }
         }

     }//for

}

public String getName() {
    return name;
}


public void setName(String name) {
    this.name = name;
}


@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {


    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity(); //reset the projection matrix
    GLU.gluPerspective(gl, 45.0f, (float)width/(float)height,
            0.1f, 100.0f); //calculate the aspect ratio of window
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();


}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    //set the bg as black
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    gl.glShadeModel(GL10.GL_SMOOTH);
    //depth buffer setup
    gl.glClearDepthf(1.0f);
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glDepthFunc(GL10.GL_LEQUAL);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 


}

public void addshape(Shape s) {Y = Y + 0.1F;     myArr.add(一个或多个); } }

3 个答案:

答案 0 :(得分:1)

我认为你的colors数组中没有足够的颜色。这个可能会导致一个不可见的三角形,具体取决于_colorBuffer中的初始垃圾值。

(编辑)尝试:

float[] colors = {
    1f, 1f, 0f, 1f,
    1f, 1f, 0f, 1f,
    1f, 1f, 0f, 1f
};

答案 1 :(得分:0)

这里我的三角形代码来自一个有效的项目。看起来您的索引和颜色数组是不同的

package com.martynhaigh.Vortex;

import android.view.animation.Transformation;

import javax.microedition.khronos.opengles.GL10;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;

public class Triangle {

    private ShortBuffer _indexBuffer;
    private FloatBuffer _vertexBuffer;
    private FloatBuffer _colorBuffer;
    static float _xAngle, _yAngle;
    private int _nrOfVertices; 

    Triangle() {
        float[] coords = {
                -0.5f, -0.5f, 0f, // (x1, y1, z1)
                0.5f, -0.5f, 0f, // (x2, y2, z2)
                0f, 0.5f, 0f // (x3, y3, z3)
        }; // 9

        _nrOfVertices = coords.length / 3;

        float[] colors = {
                1f, 0f, 0f, 1f, // point 1
                0f, 1f, 0f, 1f, // point 2
                0f, 0f, 1f, 1f // point 3
        }; // 12

        short[] indices = {0, 1, 2}; // 3

        // float has 4 bytes, coordinate * 4 bytes
        ByteBuffer vbb = ByteBuffer.allocateDirect(coords.length * 4); //36
        vbb.order(ByteOrder.nativeOrder());
        _vertexBuffer = vbb.asFloatBuffer();

        // short has 2 bytes, indices * 2 bytes
        ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2); // 6
        ibb.order(ByteOrder.nativeOrder());
        _indexBuffer = ibb.asShortBuffer();

        // float has 4 bytes, colors (RGBA) * 4 bytes
        ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length * 4); // 48
        cbb.order(ByteOrder.nativeOrder());
        _colorBuffer = cbb.asFloatBuffer();

        _vertexBuffer.put(coords);
        _indexBuffer.put(indices);
        _colorBuffer.put(colors);

        _vertexBuffer.position(0);
        _indexBuffer.position(0);
        _colorBuffer.position(0);
    }

    public void onDraw(GL10 gl) {
        // set rotation
        gl.glRotatef(_xAngle, 1f, 0f, 0f);
        gl.glRotatef(_yAngle, 0f, 1f, 0f);

        // set the color of our element
        //gl.glColor4f(0.5f, 0f, 0f, 0.5f);
        gl.glColorPointer(4, GL10.GL_FLOAT, 0, _colorBuffer);

        // define the vertices we want to draw
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer);

        // finally draw the vertices
        gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);   
    }

    public void setXAngle(float angle) {
        _xAngle = angle;
    }

    public float getXAngle() {
        return _xAngle;
    }

    public void setYAngle(float angle) {
        _yAngle = angle;
    }

    public float getYAngle() {
        return _yAngle;
    }
}

答案 2 :(得分:0)

首先,Martin对colors数组是正确的。它需要为每个顶点都有一个颜色(在你的例子中是4个值)(所以总共有12个值)。

接下来,当你的三角形位于xz平面内并且你没有对模型视图矩阵做任何改变时(除了沿z轴平移),你应该只看到一条线,如果有的话(想到从侧面看的一张纸。)

但你真正的问题是你的画画循环。我想你不仅是OpenGL的新手,也是Java和面向对象编程的新手。整个设计完全是垃圾。这就是面向对象代码中虚函数的用途。让每个形状实现其正确的draw方法。所以你唯一需要做的就是

for (Shape t : myArr)
    t.draw(gl);

鉴于Shape具有抽象draw方法,其他子类实现。但这更像是一个设计缺陷。实际的错误是,if的大括号被破坏了。目前只绘制三角形,如果tPyramidTriangle的实例,则永远不会为三角形(以及线条)调用draw