【问题标题】:Draw array of points with OpenGL用OpenGL绘制点数组
【发布时间】:2012-02-09 15:21:57
【问题描述】:

为什么在这个程序中 glVertex3f 绘制的四个点在指定位置渲染,而不是四个数组点只在窗口中心渲染一个?

#include <GL/glew.h>
#include <GL/glut.h>

#include <iostream>
#include <vector>

using namespace std;

struct point3 {
    GLfloat x, y, z;
};

vector<point3> Vertices(4);

void display(void)
{
    glClear (GL_COLOR_BUFFER_BIT);
    GLuint abuffer;
    glGenVertexArrays(1, &abuffer);
    glBindVertexArray(abuffer);
    GLuint buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    Vertices = {{0.3f, 0.3f, 0.5f}, {0.6f, 0.6f, 0.5f}, {0.6f, 0.3f, 0.5f}, {0.3f, 0.6f, 0.5f}};
    glBufferData(GL_ARRAY_BUFFER, Vertices.size() * sizeof(Vertices[0]), &Vertices[0], GL_STATIC_DRAW);
    glVertexPointer(3, GL_FLOAT, 0, &Vertices[0]);
    glDrawArrays(GL_POINTS, 0, Vertices.size());
    glFlush();
    glBegin(GL_POINTS);
    glVertex3f(0.25f, 0.25f, 0.5f);
    glVertex3f(0.25f, 0.75f, 0.5f);
    glVertex3f(0.75f, 0.75f, 0.5f);
    glVertex3f(0.75f, 0.25f, 0.5f);
    glEnd();    
    glFlush();
} 

void init (void)
{
    glClearColor (0.0, 0.0, 0.0, 0.0);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);

} 

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("simple OpenGL example");
    glutDisplayFunc(display);
    GLenum err = glewInit();
    if (GLEW_OK != err) {
        cerr << "Error: " << glewGetErrorString(err) << endl;
    }
    cout << "Status: Using GLEW" << glewGetString(GLEW_VERSION) << endl;    
    init();
    glutMainLoop();
}

【问题讨论】:

  • 你为什么要生成一个顶点数组和缓冲区对象每一帧你渲染?这是一次性的设置工作,而不是每个框架的工作。
  • @Nicol Bolas,我试图让它工作并做了很多事情,确保它必须在单独的功能中。
  • @NicolBolas 好点,但这可能只是 SO 的一个缩小示例。
  • 好的,问题出在这行 ''glVertexPointer(3, GL_FLOAT, 0, NULL);'' - 最后一个参数

标签: c++ opengl


【解决方案1】:

您尚未启用该属性以实际使用该数组。你这样做:

  • (OpenGL 2)glEnableClientState(GL_VERTEX_ARRAY)(或GL_COLOR_ARRAY等)
  • (OpenGL 3)glEnableVertexArray(attributeId)

否则,您用glVertexPointer (GL2) 或glVertexAttribPointer (GL3) 指向的内容将不会被实际使用。

【讨论】:

  • 如果我将 glEnableClientState 放在 glVertexPointer 之前,将 glDisableClientState 放在 glDrawArrays 之后,它无论如何都不起作用。可以显示代码 sn-p 吗?
猜你喜欢
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多