Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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
C++ 使用GLDraweElements()绘制多维数据集?_C++_C_Opengl - Fatal编程技术网

C++ 使用GLDraweElements()绘制多维数据集?

C++ 使用GLDraweElements()绘制多维数据集?,c++,c,opengl,C++,C,Opengl,有没有办法像这样画一个立方体,结果是只向图形卡上传8个垂直方向和24个标记?如果是这样的话,如何做到这一点 谢谢 我现在是这样做的: boxdims.x = w; boxdims.y = h; boxdims.z = d; center = c; GLfloat vboverticies[72]; GLfloat vbonormals[18]; Vertex3f verticies[24]; //Top face vertici

有没有办法像这样画一个立方体,结果是只向图形卡上传8个垂直方向和24个标记?如果是这样的话,如何做到这一点

谢谢

我现在是这样做的:

boxdims.x = w;
    boxdims.y = h;
    boxdims.z = d;
    center = c;

    GLfloat vboverticies[72];
    GLfloat vbonormals[18];
    Vertex3f verticies[24];

    //Top face
    verticies[0] = Vertex3f(-boxdims.x / 2.0f,boxdims.y / 2.0f, -boxdims.z / 2.0f);
    verticies[1] = Vertex3f(-boxdims.x / 2.0f,boxdims.y / 2.0f, boxdims.z / 2.0f);
    verticies[2] = Vertex3f(boxdims.x / 2.0f,boxdims.y / 2.0f, boxdims.z / 2.0f);
    verticies[3] = Vertex3f(boxdims.x / 2.0f,boxdims.y / 2.0f, -boxdims.z / 2.0f);


    //Bottom face
    verticies[4] = Vertex3f(-boxdims.x / 2.0f,-boxdims.y / 2.0f, -boxdims.z / 2.0f);
    verticies[5] = Vertex3f(boxdims.x / 2.0f,-boxdims.y / 2.0f, -boxdims.z / 2.0f);
    verticies[6] = Vertex3f(boxdims.x / 2.0f,-boxdims.y / 2.0f, boxdims.z / 2.0f);
    verticies[7] = Vertex3f(-boxdims.x / 2.0f,-boxdims.y / 2.0f, boxdims.z / 2.0f);


    //Left face
    verticies[8] = Vertex3f(-boxdims.x / 2.0f,-boxdims.y / 2.0f, -boxdims.z / 2.0f);
    verticies[9] = Vertex3f(-boxdims.x / 2.0f,-boxdims.y / 2.0f, boxdims.z / 2.0f);
    verticies[10] =Vertex3f(-boxdims.x / 2.0f,boxdims.y / 2.0f, boxdims.z / 2.0f);
    verticies[11] =Vertex3f(-boxdims.x / 2.0f,boxdims.y / 2.0f, -boxdims.z / 2.0f);


    //Right face
    verticies[12] =Vertex3f(boxdims.x / 2.0f,-boxdims.y / 2.0f, -boxdims.z / 2.0f);
    verticies[13] =Vertex3f(boxdims.x / 2.0f,boxdims.y / 2.0f, -boxdims.z / 2.0f);
    verticies[14] =Vertex3f(boxdims.x / 2.0f,boxdims.y / 2.0f, boxdims.z / 2.0f);
    verticies[15] =Vertex3f(boxdims.x / 2.0f,-boxdims.y / 2.0f, boxdims.z / 2.0f);

    //Front face
    verticies[16] =Vertex3f(-boxdims.x / 2.0f,-boxdims.y / 2.0f, boxdims.z / 2.0f);
    verticies[17] =Vertex3f(boxdims.x / 2.0f,-boxdims.y / 2.0f, boxdims.z / 2.0f);
    verticies[18] =Vertex3f(boxdims.x / 2.0f,boxdims.y / 2.0f, boxdims.z / 2.0f);
    verticies[19] =Vertex3f(-boxdims.x / 2.0f,boxdims.y / 2.0f, boxdims.z / 2.0f);

    //Back face
    verticies[20] =Vertex3f(-boxdims.x / 2.0f,-boxdims.y / 2.0f, -boxdims.z / 2.0f);
    verticies[21] =Vertex3f(-boxdims.x / 2.0f,boxdims.y / 2.0f, -boxdims.z / 2.0f);
    verticies[22] =Vertex3f(boxdims.x / 2.0f,boxdims.y / 2.0f, -boxdims.z / 2.0f);
    verticies[23] =Vertex3f(boxdims.x / 2.0f,-boxdims.y / 2.0f, -boxdims.z / 2.0f);




    for(int i = 0; i < 24; i++)
    {
        verticies[i].x += center.x;
        verticies[i].y += center.y;
        verticies[i].z += center.z;
    }


    int count = 0;
    for(int i = 0; i < 24; ++i)
    {
        vboverticies[count] = verticies[i].x;
        count++;
        vboverticies[count] = verticies[i].y;
        count++;
        vboverticies[count] = verticies[i].z;
        count++;
    }

    //glNormal3f(0.0, 1.0f, 0.0f);
    //glNormal3f(0.0, -1.0f, 0.0f);
    //glNormal3f(-1.0, 0.0f, 0.0f);
    //glNormal3f(1.0, 0.0f, 0.0f);
    //glNormal3f(0.0, 0.0f, 1.0f);
    //glNormal3f(0.0, 0.0f, -1.0f);
    vbonormals[0] = (0.0);
    vbonormals[1] = (1.0);
    vbonormals[2] = (0.0);

    vbonormals[3] = (0.0);
    vbonormals[4] = (-1.0);
    vbonormals[5] = (0.0);

    vbonormals[6] = (-1.0);
    vbonormals[7] = (0.0);
    vbonormals[8] = (0.0);

    vbonormals[9] = (1.0);
    vbonormals[10]= (0.0);
    vbonormals[11]= (0.0);

    vbonormals[12]= (0.0);
    vbonormals[13]= (0.0);
    vbonormals[14]= (1.0);

    vbonormals[15]= (0.0);
    vbonormals[16]= (0.0);
    vbonormals[17]= (-1.0);



    //Create the VBO
    glDeleteBuffers(1, &vboID);
    glGenBuffersARB(1, &vboID);
    glBindBufferARB(GL_ARRAY_BUFFER, vboID);
    glBufferDataARB(GL_ARRAY_BUFFER, (72 * sizeof(GLfloat)) + 
        (18 * sizeof(GLfloat)) , NULL, GL_STATIC_COPY);

    glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, 72 * sizeof(GLfloat), vboverticies);
    glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 72 * sizeof(GLfloat),
        18 * sizeof(GLfloat), vbonormals);


}
boxdims.x=w;
boxdims.y=h;
boxdims.z=d;
中心=c;
GLV建议[72];
GLV标准值[18];
顶点3f垂直[24];
//顶面
垂直度[0]=顶点3F(-boxdims.x/2.0f,boxdims.y/2.0f,-boxdims.z/2.0f);
垂直[1]=顶点3F(-boxdims.x/2.0f,boxdims.y/2.0f,boxdims.z/2.0f);
垂直[2]=顶点3F(长方体尺寸x/2.0f,长方体尺寸y/2.0f,长方体尺寸z/2.0f);
垂直[3]=顶点3F(长方体尺寸x/2.0f,长方体尺寸y/2.0f,-长方体尺寸z/2.0f);
//底面
垂直方向[4]=顶点3F(-boxdims.x/2.0f,-boxdims.y/2.0f,-boxdims.z/2.0f);
垂直[5]=顶点3F(长方体尺寸x/2.0f,-长方体尺寸y/2.0f,-长方体尺寸z/2.0f);
垂直[6]=顶点3F(长方体尺寸x/2.0f,-长方体尺寸y/2.0f,长方体尺寸z/2.0f);
垂直[7]=顶点3F(-boxdims.x/2.0f,-boxdims.y/2.0f,boxdims.z/2.0f);
//左脸
垂直度[8]=顶点3F(-boxdims.x/2.0f,-boxdims.y/2.0f,-boxdims.z/2.0f);
垂直[9]=顶点3F(-boxdims.x/2.0f,-boxdims.y/2.0f,boxdims.z/2.0f);
垂直[10]=顶点3F(-boxdims.x/2.0f,boxdims.y/2.0f,boxdims.z/2.0f);
垂直[11]=顶点3F(-boxdims.x/2.0f,boxdims.y/2.0f,-boxdims.z/2.0f);
//右脸
垂直[12]=顶点3F(长方体尺寸x/2.0f,-长方体尺寸y/2.0f,-长方体尺寸z/2.0f);
垂直[13]=顶点3F(长方体尺寸x/2.0f,长方体尺寸y/2.0f,-长方体尺寸z/2.0f);
垂直[14]=顶点3F(长方体尺寸x/2.0f,长方体尺寸y/2.0f,长方体尺寸z/2.0f);
垂直[15]=顶点3F(长方体尺寸x/2.0f,-长方体尺寸y/2.0f,长方体尺寸z/2.0f);
//正面
垂直[16]=顶点3F(-boxdims.x/2.0f,-boxdims.y/2.0f,boxdims.z/2.0f);
垂直[17]=顶点3F(长方体尺寸x/2.0f,-长方体尺寸y/2.0f,长方体尺寸z/2.0f);
垂直[18]=顶点3F(长方体尺寸x/2.0f,长方体尺寸y/2.0f,长方体尺寸z/2.0f);
垂直[19]=顶点3F(-boxdims.x/2.0f,boxdims.y/2.0f,boxdims.z/2.0f);
//背面
垂直[20]=顶点3F(-boxdims.x/2.0f,-boxdims.y/2.0f,-boxdims.z/2.0f);
垂直[21]=顶点3F(-boxdims.x/2.0f,boxdims.y/2.0f,-boxdims.z/2.0f);
垂直[22]=顶点3F(长方体尺寸x/2.0f,长方体尺寸y/2.0f,-长方体尺寸z/2.0f);
垂直[23]=顶点3F(长方体尺寸x/2.0f,-长方体尺寸y/2.0f,-长方体尺寸z/2.0f);
对于(int i=0;i<24;i++)
{
垂直[i].x+=center.x;
垂直[i].y+=中心.y;
垂直[i].z+=center.z;
}
整数计数=0;
对于(int i=0;i<24;++i)
{
vbovertices[count]=vertices[i].x;
计数++;
vbovertices[count]=vertices[i].y;
计数++;
vbovertices[count]=vertices[i].z;
计数++;
}
//glNormal3f(0.0,1.0f,0.0f);
//glNormal3f(0.0,-1.0f,0.0f);
//glNormal3f(-1.0,0.0f,0.0f);
//glNormal3f(1.0,0.0f,0.0f);
//glNormal3f(0.0,0.0f,1.0f);
//glNormal3f(0.0,0.0f,-1.0f);
vbonormals[0]=(0.0);
vbonormals[1]=(1.0);
vbonormals[2]=(0.0);
vbonormals[3]=(0.0);
vbonormals[4]=(-1.0);
vbonormals[5]=(0.0);
vbonormals[6]=(-1.0);
vbonormals[7]=(0.0);
vbonormals[8]=(0.0);
vbonormals[9]=(1.0);
vbonormals[10]=(0.0);
vbonormals[11]=(0.0);
vbonormals[12]=(0.0);
vbonormals[13]=(0.0);
vbonormals[14]=(1.0);
vbonormals[15]=(0.0);
vbonormals[16]=(0.0);
vbonormals[17]=(-1.0);
//创建VBO
glDeleteBuffers(1和vboID);
glGenBuffersARB(1,&vboID);
glBindBufferARB(GL_数组_缓冲区,vboID);
glBufferDataARB(GL_数组_缓冲区,(72*sizeof(GLfloat))+
(18*sizeof(GLfloat)),空,总账静态拷贝);
glBufferSubDataARB(GL_数组_BUFFER_ARB,0,72*sizeof(GLfloat),vboverticies);
glBufferSubDataARB(GL_数组_BUFFER_ARB,72*sizeof(GLfloat),
18*sizeof(GLfloat),vbonormals);
}

也许这会有帮助-

答案是否定的


如果需要法线,则必须有24个顶点,因为没有面共享法线。请注意,shk提供的示例不处理法线。

您可以,但您必须使用几何体着色器来处理法线,并且在您真正了解自己在做什么之前,不应该弄乱这些东西。更重要的是,对于一个立方体来说,这真的没什么大不了的

我应该保持哪一个垂直=它们的8个顶点(v0,v7)@Milo立方体的每个点一个。。。在您的情况下,这将使顶点0到7包含在内。但是要注意索引。@Milo:就像shk给你的链接一样。使用8个顶点和24个索引,使用glpaurements()