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

Posted

技术标签:

【中文标题】尝试使用 glVertex2i 在 openGL 中绘制点时使用 int 数组【英文标题】:Using an array of int when trying to draw points in openGL using glVertex2i 【发布时间】:2018-07-12 05:07:52 【问题描述】:

我正在尝试将我制作的寻路算法合并到代码中,但遇到了问题。我试图灵活地使用我的代码并允许不同长度的数据集,然后使用 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();

【问题讨论】:

为什么你有两个嵌套的for 循环,都有一个循环计数器i?外循环是做什么用的? 我认为问题不在于 int 和 GLint 之间的转换。您确定数据有效(大小不为零,或者顶点不完全相同)? 【参考方案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]);
    

    但真正的问题在于后面的子弹......

    矩阵

    我们没有看到任何矩阵或您的点的范围。 OpenGL 默认使用单位矩阵,这意味着您的点应该是&lt;-1,+1&gt; 可见,这在整数上不实用。因此,如果您的点以像素为单位,并且您的屏幕分辨率为 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);
    

    glColor3f(250,250,250)

    OpenGL 中颜色的浮点范围是&lt;0.0,1.0&gt;,因此您设置了错误的颜色。试试这个:

    glColor3f(1.0,1.0,1.0);
    

    glPointSize(100)

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

    glPointSize(8);
    

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

Drawing a line using individual pixels in OpenGl core

相关的 QA 包含新旧 API 的工作示例。

【讨论】:

以上是关于尝试使用 glVertex2i 在 openGL 中绘制点时使用 int 数组的主要内容,如果未能解决你的问题,请参考以下文章

C ++ OpenGL Draw Pixel

OpenGL画圆

通过循环向量链表使用opengl1绘制线条

OpenGL - 尝试使用 VBO 会导致错误

尝试在大位图上使用 OpenGL 纹理压缩 - 得到白色方块

尝试使用opengl函数glMapBufferRange在python中制作外星人