Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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中两个数组缓冲区的绘制_Opengl_Graphics - Fatal编程技术网

OpenGL中两个数组缓冲区的绘制

OpenGL中两个数组缓冲区的绘制,opengl,graphics,Opengl,Graphics,我试图创建一个余弦曲线和轴的折线图。我遇到的问题是,线条带在绘制线条后将继续绘制轴(即,我希望线条绘制、停止,然后轴开始单独绘制。现在发生的是线条将线条和轴都绘制为一条线条带)。更奇怪的是,我不明白的是,即使我删除了这些行: //Draw axes glBindBuffer(GL_ARRAY_BUFFER, axesBufferObject); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE

我试图创建一个余弦曲线和轴的折线图。我遇到的问题是,线条带在绘制线条后将继续绘制轴(即,我希望线条绘制、停止,然后轴开始单独绘制。现在发生的是线条将线条和轴都绘制为一条线条带)。更奇怪的是,我不明白的是,即使我删除了这些行:

//Draw axes
glBindBuffer(GL_ARRAY_BUFFER, axesBufferObject);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

glDrawArrays(GL_LINE_STRIP, 0, 2); // x axis
glDrawArrays(GL_LINE_STRIP, 2, 2); // y axis
glDrawArrays(GL_LINE_STRIP, 4, 2); // z axis

glDisableVertexAttribArray(0);
我以为这会完全停止绘制轴,它们仍然在绘制

相关代码如下所示:

//Vertices for the axes in 3 dimesions
const float axesPositions[] = {
    -1.0f, 0.0f, 0.0f, 1.0f,
    1.0f, 0.0f, 0.0f, 1.0f,
    0.0f, -1.0, 0.0f, 1.0f,
    0.0f, 1.0f, 0.0f, 1.0f,
    0.0f, 0.0f, -1.0f, 1.0f,
    0.0f, 0.0f, 1.0f, 1.0f,
};


//calculates cosine line vertices
std::vector<float> fillPositions()
{
    std::vector<float> arr;
    for (float x = -1.0f; x < 1.0f; x += 0.01f)
    {
        float y;
        if (x == 0) y = 1; //divide by zero check
        y = cos(x);

        arr.push_back(x);
        arr.push_back(y);
        arr.push_back(0.0f);
        arr.push_back(1.0f);
      }

    return arr;
}    

GLuint positionBufferObject;
GLuint axesBufferObject;
GLuint vao;

std::vector<float> linePositions;

void InitializeVertexBuffers()
{
    //genereate line graph vertex buffer
    glGenBuffers(1, &positionBufferObject);

    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
    glBufferData(GL_ARRAY_BUFFER, sizeof(float) * linePositions.size(), &linePositions[0], GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    //generate axes vertex buffer
    glGenBuffers(1, &axesBufferObject);

    glBindBuffer(GL_ARRAY_BUFFER, axesBufferObject);
    glBufferData(GL_ARRAY_BUFFER, sizeof(axesPositions), axesPositions, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}


//Called after the window and OpenGL are initialized. Called exactly once, before the main loop.
void init()
{
    InitializeProgram();

    linePositions = fillPositions();

    InitializeVertexBuffers();


    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
}



//Called to update the display.
void display()
{

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glUseProgram(theProgram);

    // Draw line
    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

    glDrawArrays(GL_LINE_STRIP, 0, linePositions.size());

    glDisableVertexAttribArray(0);

    //Draw axes
    glBindBuffer(GL_ARRAY_BUFFER, axesBufferObject);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

    glDrawArrays(GL_LINE_STRIP, 0, 2); // x axis
    glDrawArrays(GL_LINE_STRIP, 2, 2); // y axis
    glDrawArrays(GL_LINE_STRIP, 4, 2); // z axis

    glDisableVertexAttribArray(0);

    glUseProgram(0);

    glutSwapBuffers();
    glutPostRedisplay();
}
//三维轴的顶点
常量浮点轴位置[]={
-1.0f,0.0f,0.0f,1.0f,
1.0f,0.0f,0.0f,1.0f,
0.0f,-1.0,0.0f,1.0f,
0.0f,1.0f,0.0f,1.0f,
0.0f,0.0f,-1.0f,1.0f,
0.0f,0.0f,1.0f,1.0f,
};
//计算余弦线顶点
std::vector fillPositions()
{
std::载体arr;
对于(浮动x=-1.0f;x<1.0f;x+=0.01f)
{
浮动y;
如果(x==0)y=1;//除以零检查
y=cos(x);
arr.推回(x);
arr.推回(y);
方位后推(0.0f);
方位后推(1.0f);
}
返回arr;
}    
胶合物;
GLuint-axesBufferObject;
GLuint-vao;
std::矢量线位置;
void InitializeVertexBuffers()
{
//生成线图顶点缓冲区
glGenBuffers(1,&positionBufferObject);
glBindBuffer(GL_数组_BUFFER,positionBufferObject);
glBufferData(GL_数组_缓冲区,sizeof(float)*linePositions.size(),&linePositions[0],GL_静态_绘制);
glBindBuffer(GL_数组_BUFFER,0);
//生成轴顶点缓冲区
glGenBuffers(1和axesBufferObject);
glBindBuffer(GL_数组_BUFFER,axesBufferObject);
glBufferData(GL_数组_缓冲区、大小(axesPositions)、axesPositions、GL_静态_绘图);
glBindBuffer(GL_数组_BUFFER,0);
}
//初始化窗口和OpenGL后调用。只调用一次,在主循环之前。
void init()
{
初始化程序();
linePositions=fillPositions();
初始化EvertexBuffers();
glGenVertexArrays(1和vao);
glBindVertexArray(vao);
}
//调用以更新显示。
无效显示()
{
glClearColor(0.0f、0.0f、0.0f、0.0f);
glClear(GLU颜色缓冲位);
glUseProgram(程序);
//划线
glBindBuffer(GL_数组_BUFFER,positionBufferObject);
GlenableVertexAttributeArray(0);
glvertexattributepointer(0,4,GL_FLOAT,GL_FALSE,0,0);
gldrawArray(GL_LINE_STRIP,0,linePositions.size());
glDisableVertexAttributeArray(0);
//画轴
glBindBuffer(GL_数组_BUFFER,axesBufferObject);
GlenableVertexAttributeArray(0);
glvertexattributepointer(0,4,GL_FLOAT,GL_FALSE,0,0);
glDrawArray(GL_LINE_STRIP,0,2);//x轴
glDrawArray(GL_LINE_STRIP,2,2);//y轴
glDrawArray(GL_LINE_STRIP,4,2);//z轴
glDisableVertexAttributeArray(0);
glUseProgram(0);
glutSwapBuffers();
再发现();
}
linePositions.size()是数组中的浮点数,而不是要绘制的顶点数

更改此行:

glDrawArrays(GL_LINE_STRIP, 0, linePositions.size());
为此:

glDrawArrays(GL_LINE_STRIP, 0, linePositions.size()/4);

哦,是的!先生,你是一位绅士和学者。你能告诉我为什么在这个修复之前,即使它们在不同的缓冲区中,它也会绘制轴吗?@bananamana:因为这两个缓冲区在GPU内存中恰好彼此靠近?