安卓的OpenGL ES 2,绘图方块 [英] Android OpenGL ES 2, Drawing squares

查看:248
本文介绍了安卓的OpenGL ES 2,绘图方块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

编辑:问题解决 所以,我一直在经历了官方的OpenGL ES 2教程为Android,我已经得到了涉及绘制形状的一部分,但我似乎无法得到方形的工作。它吸引了一个直角三角形来代替。

我已经包括了我使用的定义和绘制形状,这是从本教程复制几乎完全code。该渲染器类简单地创建这种形状的实例,并调用draw方法。

由于某些原因,本教程不给的值/声明vertexStride和vertexCount,所以那些我在那里的猜测。我试过几个值vertexCount(1至12),并没有工作。

在此先感谢。

 公共类方{

                私人FloatBuffer vertexBuffer;
                私人ShortBuffer drawListBuffer;

                //此数组中每个顶点的坐标数量
                静态最终诠释COORDS_PER_VERTEX = 3;
                静浮squareCoords [] = {-0.5f,0.5F,0.0,//左上
                                                -0.5f,-0.5f,0.0,//左下
                                                 0.5F,-0.5f,0.0,//右下
                                                 0.5F,0.5F,0.0}; // 右上

                私人短DRAWORDER [] = {0,1,2,0,2,3}; //为了绘制顶点
                浮色[] = {0.63671875f,0.76953125f,0.22265625f,1.0F};


                私人最终字符串vertexShader code =
                        属性vec4 vPosition; +
                        无效的主要(){+
                        GL_POSITION = vPosition; +
                        };

                私人最终字符串fragmentShader code =
                    precision mediump浮动; +
                    统一vec4 vColor; +
                    无效的主要(){+
                    gl_FragColor = vColor; +
                    };

                INT mProgram;

                静态最终诠释vertexStride = COORDS_PER_VERTEX * 4;
                静态最终诠释vertexCount = 4;

                市民广场(){
                    //初始化为形状坐标顶点字节的缓冲区
                    ByteBuffer的BB = ByteBuffer.allocateDirect(squareCoords.length * 4); //(#坐标值* 4%的浮动字节)
                    bb.order(ByteOrder.nativeOrder());
                    vertexBuffer = bb.asFloatBuffer();
                    vertexBuffer.put(squareCoords);
                    vertexBuffer.position(0);

                    //初始化字节的缓冲区的抽奖名单
                    ByteBuffer的DLB = ByteBuffer.allocateDirect(drawOrder.length * 2); //(#坐标值的每个短* 2字节)
                    dlb.order(ByteOrder.nativeOrder());
                    drawListBuffer = dlb.asShortBuffer();
                    drawListBuffer.put(DRAWORDER);
                    drawListBuffer.position(0);


                    INT vertexShader = loadShader(GLES20.GL_VERTEX_SHADER,vertexShader code);
                    INT fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER,fragmentShader code);

                    mProgram = GLES20.glCreateProgram(); //创建空的OpenGL ES项目
                    GLES20.glAttachShader(mProgram,vertexShader); //添加顶点着色器程序
                    GLES20.glAttachShader(mProgram,fragmentShader); //添加片段着色器进行编程
                    GLES20.glLinkProgram(mProgram); //创建OpenGL ES的可执行程序
                }

                公共静态INT loadShader(整型,字符串着色器code){

                    //创建一个顶点着色器类型(GLES20.GL_VERTEX_SHADER)
                    //或片段着色器类型(GLES20.GL_FRAGMENT_SHADER)
                    INT着色器= GLES20.glCreateShader(类型);

                    //添加源$ C ​​$ C到着色器和编译
                    GLES20.glShaderSource(着色,着色器code);
                    GLES20.glCompileShader(着色);

                    返回着色器;
                }

                公共无效平局(){
                    //添加程序OpenGL ES的环境
                    GLES20.glUseProgram(mProgram);

                    //得到处理到顶点着色器的vPosition成员
                    INT mPositionHandle = GLES20.glGetAttribLocation(mProgramvPosition);

                    //启用句柄三角形顶点
                    GLES20.glEnableVertexAttribArray(mPositionHandle);

                    // prepare三角坐标数据
                    GLES20.glVertexAttribPointer(mPositionHandle,COORDS_PER_VERTEX,
                                                 GLES20.GL_FLOAT,假的,
                                                 vertexStride,vertexBuffer);

                    //得到处理,以片段着色器的vColor成员
                    INT mColorHandle = GLES20.glGetUniformLocation(mProgramvColor);

                    //设置颜色绘制三角形
                    GLES20.glUniform4fv(mColorHandle,1,颜色,0);

                    //绘制三角形
                    GLES20.glDrawArrays(GLES20.GL_TRIANGLES,0,vertexCount);

                    //禁用顶点数组
                    GLES20.glDisableVertexAttribArray(mPositionHandle);
                }
            }
 

解决方案

  vertexCount = squareCoords.length / COORDS_PER_VERTEX; //顶点计数是阵列由顶点​​前的大小划分。 (X,Y)或(X,Y,Z)
vertexStride = COORDS_PER_VERTEX * 4; // 4是在浮法多少字节
 

让我知道这是否制定了你,祝你好运。

我觉得你还缺少 ModelViewProjection 矩阵用于三维空间转换到2D屏幕空间。 mvpMatrix应该由绘制函数画中传递(浮动[] mvpMatrix) 忘了提,你也应该使用 DrawElements(...)(示例中使用)如果你没有必要为计数或步幅,一个idicies数组只是长度和绘图缓冲器。

  //获取处理到图形的变换矩阵
    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramuMVPMatrix);

    //应用投影和视图变换
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle,1,假的,mvpMatrix,0);

    //绘制正方形
    GLES20.glDrawElements(GLES20.GL_TRIANGLES,drawOrder.length,
                          GLES20.GL_UNSIGNED_SHORT,drawListBuffer);
 

EDIT: Problem solved! So I've been going through the official OpenGL ES 2 tutorials for Android, and I've gotten to the part that involves drawing shapes, but I can't seem to get a square to work. It draws a right triangle instead.

I've included the code that I'm using to define and draw the shape, which is copied almost exactly from the tutorial. The Renderer class simply creates an instance of this shape and calls the draw method.

For some reason, the tutorial does not give the values/declaration for vertexStride and vertexCount, so the ones I have in there are educated guesses. I've tried several values for vertexCount (1 thru 12), and none work.

Thanks in advance.

            public class Square {

                private FloatBuffer vertexBuffer;
                private ShortBuffer drawListBuffer;

                // number of coordinates per vertex in this array
                static final int COORDS_PER_VERTEX = 3;
                static float squareCoords[] = { -0.5f,  0.5f, 0.0f,   // top left
                                                -0.5f, -0.5f, 0.0f,   // bottom left
                                                 0.5f, -0.5f, 0.0f,   // bottom right
                                                 0.5f,  0.5f, 0.0f }; // top right

                private short drawOrder[] = { 0, 1, 2, 0, 2, 3 }; // order to draw vertices
                float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f };


                private final String vertexShaderCode =
                        "attribute vec4 vPosition;" +
                        "void main() {" +
                        "  gl_Position = vPosition;" +
                        "}";

                private final String fragmentShaderCode =
                    "precision mediump float;" +
                    "uniform vec4 vColor;" +
                    "void main() {" +
                    "  gl_FragColor = vColor;" +
                    "}";

                int mProgram;

                static final int vertexStride = COORDS_PER_VERTEX * 4;
                static final int vertexCount = 4;

                public Square() {
                    // initialize vertex byte buffer for shape coordinates
                    ByteBuffer bb = ByteBuffer.allocateDirect(squareCoords.length * 4); // (# of coordinate values * 4 bytes per float)
                    bb.order(ByteOrder.nativeOrder());
                    vertexBuffer = bb.asFloatBuffer();
                    vertexBuffer.put(squareCoords);
                    vertexBuffer.position(0);

                    // initialize byte buffer for the draw list
                    ByteBuffer dlb = ByteBuffer.allocateDirect(drawOrder.length * 2); // (# of coordinate values * 2 bytes per short)
                    dlb.order(ByteOrder.nativeOrder());
                    drawListBuffer = dlb.asShortBuffer();
                    drawListBuffer.put(drawOrder);
                    drawListBuffer.position(0);


                    int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
                    int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);

                    mProgram = GLES20.glCreateProgram();             // create empty OpenGL ES Program
                    GLES20.glAttachShader(mProgram, vertexShader);   // add the vertex shader to program
                    GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program
                    GLES20.glLinkProgram(mProgram);                  // creates OpenGL ES program executables
                }

                public static int loadShader(int type, String shaderCode){

                    // create a vertex shader type (GLES20.GL_VERTEX_SHADER)
                    // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
                    int shader = GLES20.glCreateShader(type);

                    // add the source code to the shader and compile it
                    GLES20.glShaderSource(shader, shaderCode);
                    GLES20.glCompileShader(shader);

                    return shader;
                }

                public void draw() {
                    // Add program to OpenGL ES environment
                    GLES20.glUseProgram(mProgram);

                    // get handle to vertex shader's vPosition member
                    int mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");

                    // Enable a handle to the triangle vertices
                    GLES20.glEnableVertexAttribArray(mPositionHandle);

                    // Prepare the triangle coordinate data
                    GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
                                                 GLES20.GL_FLOAT, false,
                                                 vertexStride, vertexBuffer);

                    // get handle to fragment shader's vColor member
                    int mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");

                    // Set color for drawing the triangle
                    GLES20.glUniform4fv(mColorHandle, 1, color, 0);

                    // Draw the triangle
                    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);

                    // Disable vertex array
                    GLES20.glDisableVertexAttribArray(mPositionHandle);
                }
            }

解决方案

vertexCount = squareCoords.length/COORDS_PER_VERTEX; //Vertex count is the array divided by the size of the vertex ex. (x,y) or (x,y,z) 
vertexStride = COORDS_PER_VERTEX * 4;                //4 are how many bytes in a float

Let me know if that worked out for you, good luck.

I think your also missing the ModelViewProjection Matrix used to convert 3D space to 2D screen space. mvpMatrix should be passed in by the draw function draw(float[] mvpMatrix) Forgot to mention you also should use DrawElements(...) (used in example) if you do there's no need for the count or stride, just the length of an idicies array and a drawing buffer.

    // Get handle to shape's transformation matrix
    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");

    // Apply the projection and view transformation
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);

    // Draw the square
    GLES20.glDrawElements(GLES20.GL_TRIANGLES, drawOrder.length,
                          GLES20.GL_UNSIGNED_SHORT, drawListBuffer);

这篇关于安卓的OpenGL ES 2,绘图方块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆