用glDrawElements画多次边形,其中的参数,点的index,这个顺序是是不是按为点设置空间位置的顺序确定的呢?我遇到这样的问题:
我想建一个网格
算法是先建立第一排点,再建立第二排点 // create vertices
float x=-size/2.0, z=-size/2.0;
for ( int i = 0; i <=h; i++ )
{
for ( int j = 0; j <=w; j++ )
{
Vertex* ver;
newVertex( ver );
ver->setPosition( x, 0, z );
x += wSize;
}
x=-size/2.0;
z += hSize;
}
.....
如果我建一个2*2的网格,点的序号应该该是
v6 v7 v8
v3 v4 v5
v0 v1 v2如果1*1的
v2 v3
v0 v1
...
可是我在glDrawElements里面按照0,1,3,2的顺序出来的是个扭曲的四方形,用0,1,2,3才是正常的
可是按照点的空间位置建立的顺序,用0,1,2,3建立出来的四方型才是错误的阿?
这里很糊涂,请高手指教。谢谢

解决方案 »

  1.   

    没办法一次性绘制n X n的,连续绘制只能绘制 1 X n的或 n  X 1的如 1 X 2
    v0  v2  v5  
    v1  v3  v42 X 1就是
    v0  v1
    v2  v3
    v4  v5n X n的只能多次绘制
      

  2.   

    是不是把glDrawElements第一个参数设成GL_TRIANGLE_STRIP了?
      

  3.   

    icosagon:
    我没用n*n只是用1*1的来试验的,也不行
    而且我看红皮opengl权威指南中,有个例子是做盒子,他就是一下子输入了六个面的序号阿pause_break:绘制代码是这样的..建立1*1的网格数据
    Organ org(1,1);
    把数据传入到main.cpp中
    static void grid()
    {
            ........//得到点的空间位置和点的顺序
    for(int i=0; i<org.numVer(); i++){
    int j=i*2;
    float x = (float)pos[i]->getX();
    float y = (float)pos[i]->getZ();
    posArray[j]=x;
    posArray[j+1]=y;
    }
    /*for(int i=0;i<conVerIdSize;i++){
    connectArray[i]=connect[i];
    }*/
            做实验用的序号
             static int connectArray[]={0,1,3,2};
    glPolygonMode(GL_FRONT,GL_LINE); glEnableClientState( GL_VERTEX_ARRAY);
    glVertexPointer( 2, GL_FLOAT, 0,posArray);
            在这里画
    glDrawElements(GL_QUADS, conVerIdSize,GL_UNSIGNED_INT,connectArray);
    glDisableClientState(GL_VERTEX_ARRAY);}
    是不是我这个顺序有什么问题呢?还是什么别的原因?
      

  4.   

    我前面以为你是以GL_QUAD_STRIP模式画的了,
    以GL_QUADS可以一次性画下来,看你顶点数组和索引数组是怎么排的,而且你要画在x, z轴上需要指定三个点的,两个点只能画在xy轴上,或者通过模型变换到xz轴上.static float varray[] = {-2.0, -2.0, -1.0, -2.0, 0.0, -2.0, 1.0, -2.0,
                             -2.0, -1.0, -1.0, -1.0, 0.0, -1.0, 1.0, -1.0,
                             -2.0,  0.0, -1.0,  0.0, 0.0,  0.0, 1.0,  0.0};static unsigned int indices[] = {0, 1, 5, 4, 4, 5, 9, 8, 1, 2, 6, 5, 5, 6, 10, 9, 2, 3, 7, 6, 6, 7, 11, 10};
    void init()
    {
        glClearColor(0.0, 0.0, 0.0, 0.0);
        glPolygonMode(GL_FRONT, GL_LINE);
        glEnableClientState(GL_VERTEX_ARRAY);
        glVertexPointer(2, GL_FLOAT, 0, varray);
    }void display()
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glColor3f(0.0, 1.0, 0.0);
        glDrawElements(GL_QUADS, sizeof(indices) /4, GL_UNSIGNED_INT, indices);
    }
    这样画就可以