尝试使用 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 默认使用单位矩阵,这意味着您的点应该是<-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);
glColor3f(250,250,250)
OpenGL 中颜色的浮点范围是<0.0,1.0>
,因此您设置了错误的颜色。试试这个:
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 数组的主要内容,如果未能解决你的问题,请参考以下文章