Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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 OpenGL-4:如何使用VOA创建圆和线的圆_C_Opengl - Fatal编程技术网

C OpenGL-4:如何使用VOA创建圆和线的圆

C OpenGL-4:如何使用VOA创建圆和线的圆,c,opengl,C,Opengl,我有这样一个OpenGL-4代码(见下文)。我已经为顶点创建了一个缓冲区,并希望借助init()中的for循环对其进行初始化 它应该是一个由30行组成的圆圈(稍后被圆圈包围),但我只能在屏幕上看到第一行。我以前也用glVertex做过类似的事情。但对于美国之音,我真的不知道该怎么办;我试了很多,但我真的很困惑;可能是一些愚蠢的错误或是我的误解,我没能找到它。美国之音有可能这样做吗 GLuint lineArrayID; GLuint lineVertexBuffer; G

我有这样一个OpenGL-4代码(见下文)。我已经为顶点创建了一个缓冲区,并希望借助init()中的for循环对其进行初始化

它应该是一个由30行组成的圆圈(稍后被圆圈包围),但我只能在屏幕上看到第一行。我以前也用glVertex做过类似的事情。但对于美国之音,我真的不知道该怎么办;我试了很多,但我真的很困惑;可能是一些愚蠢的错误或是我的误解,我没能找到它。美国之音有可能这样做吗

    GLuint lineArrayID;
    GLuint lineVertexBuffer;
    GLuint numLines = 30;
    static GLfloat lineVertexBufferData[30][2] = {}; 
    void init() {
    draw_circle();
    glClearColor(1.0, 1.0, 1.0, 1.0);//background of the window

     GLfloat x, y;
    double angle;
    GLfloat radius = 5.0;

    angle = 2 * PI / 30;
    int j = 0;
    float i = 0;
    for (i = -PI; i < -PI; i += 0.15){
        std::cout << " +"<<std:: endl;
        x = sin(i);
        y = cos(i);

        lineVertexBufferData[j][0] = 0.0;  lineVertexBufferData[j][1] = 0.0;

        lineVertexBufferData[j][0] = x;     lineVertexBufferData[j][1] = y;

        j++;
    }

     // compile and activate the desired shader program
     shaderProgramID = loadShaders("D.vs", "D.fs");
     glUseProgram(shaderProgramID);
     // generate Buffers for our objects

    prepareLines();
    }

    void prepareLines(){


    glGenVertexArrays(1, &lineArrayID);  //gen one array object
    glBindVertexArray(lineArrayID);      //binds it

    glGenBuffers(1, &lineVertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, lineVertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, numLines * 60 * sizeof(GLfloat), lineVertexBufferData, GL_STATIC_DRAW);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

    glEnableVertexAttribArray(0);
    glBindVertexArray(0);

}
static void display(void) {
    glClear(GL_COLOR_BUFFER_BIT);


    // drawing the lines
    glBindVertexArray(lineArrayID);
glCallList(1);
    glDrawArrays(GL_LINES, 0, numLines * 2);
    glBindVertexArray(0);

    transform();
    //glRotatef(grad, 0, 0, 1);

    //glutSwapBuffers();

    glFlush();
}
GLuint lineArrayID;
GLuint lineVertexBuffer;
GLuint numLines=30;
静态GLfloat lineVertexBufferData[30][2]={};
void init(){
画一个圆();
glClearColor(1.0,1.0,1.0,1.0);//窗口的背景
glx,y;
双角度;
GLfloat半径=5.0;
角度=2*PI/30;
int j=0;
浮点数i=0;
对于(i=-PI;i<-PI;i+=0.15){
标准::cout
这太大了,根本与
lineArveTextBufferData
的大小不匹配。它应该是
numLines*2*sizeof(GLfloat)
甚至是
sizeof(lineVertexBufferData)

这也是无效的;您从未创建任何显示列表,因此显示列表一不太可能存在。如果您使用的是VAO,则不需要创建它们

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
第二个参数表示每个顶点有三个组件,但从
lineVertexBufferData
判断,它应该只有两个组件

glDrawArrays(GL_LINES, 0, numLines * 2);
第三个参数是要渲染的顶点数,而不是组件数。这不应该乘以2

//glutSwapBuffers();

glFlush();
SwapBuffers
在这里是正确的,而不是
glFlush
(这几乎是不需要的)


您还可以在绘制之后调用
transform()
,而这可能是在绘制之前,否则您的转换将延迟一帧。

下面是一个关于绘制圆的代码的答案:。与您的要求不完全相同,但它应该能让您很好地了解如何执行此操作。
glDrawArrays(GL_LINES, 0, numLines * 2);
//glutSwapBuffers();

glFlush();