Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl es OpenGL ES绘图阵列绘图顺序_Opengl Es - Fatal编程技术网

Opengl es OpenGL ES绘图阵列绘图顺序

Opengl es OpenGL ES绘图阵列绘图顺序,opengl-es,Opengl Es,我试图在OpenGL ES中显示一个带有三角形带的球体,但结果很奇怪。所以我想通过使用GL_LINES_STRIP仅绘制任何初始4个顶点来查看点是如何连接的。如果分配4个或更多顶点缓冲区,结果会有所不同。原因是什么 顶点生成: for (float angleA = -90f; angleA <90; angleA += step) { float r1 = (float) Math.cos(angleA * deg); float r2 = (flo

我试图在OpenGL ES中显示一个带有三角形带的球体,但结果很奇怪。所以我想通过使用GL_LINES_STRIP仅绘制任何初始4个顶点来查看点是如何连接的。如果分配4个或更多顶点缓冲区,结果会有所不同。原因是什么

顶点生成:

 for (float angleA = -90f; angleA <90; angleA += step) {


        float r1 = (float) Math.cos(angleA * deg);
        float r2 = (float) Math.cos((angleA + step) * deg);
        float h1 = (float) Math.sin(angleA * deg);
        float h2 = (float) Math.sin((angleA + step) * deg);

        // Fixed latitude, 360 degrees rotation to traverse a weft
        for (float angleB = 0f; angleB <= 360; angleB += step) {

            float cos = (float) Math.cos(angleB * deg);
            float sin = (float) Math.sin(angleB * deg);
            float dx, dy, dz, u, w;

            float[] pt1 = new float[3];
            float[] pt2 = new float[3];

            pt1[0] = Math.round((r2 * cos) * radius);// radius*r1*sin;
            pt1[1] = Math.round((h2) * radius);//radius*h1*sin;
            pt1[2] = Math.round((r2 * sin) * radius);//*10f;radius*cos;

            pt2[0] = Math.round((r1 * cos) * radius);//radius*r2*sin;
            pt2[1] = Math.round((h1) * radius);// radius*h2*sin;
            pt2[2] = Math.round((r1 * sin) * radius);//10f;radius*cos;


            vertexBuffer.put(pt1);
            Log.d("VERTEX", "a1=" + (angleA + step) + "a2=" + (angleB) + "[" + pt1[0] + "_" + pt1[1] + "_" + pt1[2] + "]");
            vertexBuffer.put(pt2);
            Log.d("VERTEX", "a1=" + (angleA) + "a2=" + angleB + "[" + pt2[0] + "_" + pt2[1] + "_" + pt2[2] + "]");
        }
    }
图纸部分:

 mPositionHandle = GLES20.glGetAttribLocation(mProgram, "position");
GLES20.glEnableVertexAttribArray(mPositionHandle);
GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, COORDS_PER_VERTEX * floorPoints, vertexBuffer);
    GLES20.glDrawArrays(GLES20.GL_LINE_STRIP, 0, 4);
现在如果我加上所有的点
intnbpts=(int)((180/步)*(360/步+1))*2
并让循环将所有点添加到缓冲区,以显示结果

GLES20.glDrawArrays(GLES20.GL_LINE_STRIP, 0, 4);

是两行(就像最后一点不是[0,-1,0])

用于此调用的参数看起来有问题:

GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
    GLES20.GL_FLOAT, false, COORDS_PER_VERTEX * floorPoints, vertexBuffer);
第五个参数是步幅,它是属性的两个值之间的字节差。只有顶点位置存储在缓冲区中,这对应于一个顶点位置的大小,即每个顶点的坐标值。因此,电话应该是:

GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
    GLES20.GL_FLOAT, GL_FALSE, COORDS_PER_VERTEX * sizeof(GLfloat), vertexBuffer);
只要属性是紧密压缩的,您也可以通过步幅的
0

GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
    GLES20.GL_FLOAT, GL_FALSE, 0, vertexBuffer);

floorPoints
的值是多少?它是添加的点数,初始化为0,在内部循环结束时从2开始:
floorPoints+=2如果我替换为4,它是固定的,谢谢!(但这种行为对我来说似乎很奇怪)知道为什么结果图形不是正确的多面体吗?谢谢你解锁我!我误解了第五个参数的用法。
GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
    GLES20.GL_FLOAT, GL_FALSE, 0, vertexBuffer);