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内存中恰好彼此靠近?