尝试使用glVertex2i在openGL中绘制点时使用int数组

时间:2018-07-12 05:07:52

标签: c++ opengl graphics

我试图将我制作的路径查找算法合并到代码中,但是遇到了问题。我正在尝试对代码保持灵活性,并允许使用不同长度的数据集,然后使用openGL绘制点。我的问题是,对于要点,我使用指针数组来完成可变长度,而在尝试转换数据类型时,openGL不喜欢这样做。使用函数glVertex2i(),它需要GLint作为其两个参数,但是当我尝试将数组转换为GLint时,我得到了一个空白窗口。我知道这是一个typedef,但它不会从数组中提取常规int。请帮忙!

struct Points { int x, y; }; //My struct to hold the x,y cords
int size; //This is the size of the array
Points *crds = new Points[size]; //The data for this array was input in another function

for (int i = 0; i < size; i++)
{
    //These are some things to help configure the look of the points
    glEnable(GL_POINT_SMOOTH);
    glPointSize(100);
    glColor3f(250, 250, 250);
    glBegin(GL_POINTS);
    for (int i = 0; i < size; i++)
    {
        glVertex2i((GLint)crds[i].x, (GLint)crds[i].y);
    }
    glEnd();

1 个答案:

答案 0 :(得分:0)

  1. 使用GLint作为坐标

    因为int不能保证是32位的,所以在编译器和平台之间是不同的,并且现在可以是16/32/64位。您的解决方案也应该工作,但是如果您使用GLint,则无需在glVertex中强制转换(GLint),也可以使用矢量版本:

    GLint pnt[100][2];
    glVertex2iv(pnt[i]);
    

    或类似这样:

    GLint pnt[100<<1];
    glVertex2iv(pnt[i<<1]);
    

    但是真正的问题在于以下子弹...

  2. 矩阵

    我们没有看到任何矩阵,也没有看到您的积分范围。 OpenGL 默认情况下使用单位矩阵,这意味着您的点应该<-1,+1>可见,这在整数上不可行。因此,如果您的点以像素为单位且屏幕为xs,ys分辨率,则应在渲染之前添加以下内容:

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(-1.0,-1.0,0.0);
    glScalef(2.0/float(xs),2.0/float(ys),0.0);
    
  3. glColor3f(250,250,250)

    OpenGL 中颜色的浮点范围为<0.0,1.0>,因此您设置的颜色错误。尝试以下方法:

    glColor3f(1.0,1.0,1.0);
    
  4. glPointSize(100)

    100太大,因为大小以像素为单位,请尝试:

    glPointSize(8);
    

这就是我能想到的所有问题...看这里:

相关的 QA 包含旧的和新的 API 的有效示例。