我有以下代码来绘制点数组,但它只在中心绘制一个点。如何使用OpenGL绘制2D点数组?
GLint NumberOfPoints = 10;
GLfloat x[2],y[2];
glBegin( GL_POINTS );
for ( int i = 0; i < NumberOfPoints; ++i )
{
glVertex2f( x[i], y[i] );
}
glEnd();
答案 0 :(得分:8)
窗口和上下文管理需要GLUT:
#include <GL/glut.h>
#include <vector>
#include <cstdlib>
struct Point
{
float x, y;
unsigned char r, g, b, a;
};
std::vector< Point > points;
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-50, 50, -50, 50, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// draw
glColor3ub( 255, 255, 255 );
glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_COLOR_ARRAY );
glVertexPointer( 2, GL_FLOAT, sizeof(Point), &points[0].x );
glColorPointer( 4, GL_UNSIGNED_BYTE, sizeof(Point), &points[0].r );
glPointSize( 3.0 );
glDrawArrays( GL_POINTS, 0, points.size() );
glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_COLOR_ARRAY );
glFlush();
glutSwapBuffers();
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
glutInitWindowSize(640,480);
glutCreateWindow("Random Points");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
// populate points
for( size_t i = 0; i < 1000; ++i )
{
Point pt;
pt.x = -50 + (rand() % 100);
pt.y = -50 + (rand() % 100);
pt.r = rand() % 255;
pt.g = rand() % 255;
pt.b = rand() % 255;
pt.a = 255;
points.push_back(pt);
}
glutMainLoop();
return 0;
}
答案 1 :(得分:3)
你在哪里设置x [0],x [1],y [0]和y [1]的值?
如果它只在中心绘制一个点,则听起来所有这四个变量的值都设置为0。在调用gVertex2f()时,请务必初始化它们的值。
答案 2 :(得分:1)
你定义x [i]和y [i]是什么?否则它们将自动设置为0(因此居中)。此外,创建具有两个元素但访问10个元素的数组非常糟糕,因为您正在访问无法控制的内存位置。
您应该执行以下操作:
GLint NumberOfPoints = 10;
GLfloat x[10],y[10];
for(int i = 0; i < NumberOfPoints; i++){
x[i] = y[i] = (GLfloat) i;
}
glBegin( GL_POINTS );
for ( int i = 0; i < NumberOfPoints; ++i )
{
glVertex2f( x[i], y[i] );
}
glEnd();
答案 3 :(得分:0)
您的代码正常运作。使用随机值填充数组x
和y
,这将绘制随机点。
问题可能是你无法“看到”你画的点数。这是显而易见的:
默认情况下,点的颜色为黑色(0,0,0,在rgb中),您可能希望使用glColor3f
或其他函数将其设置为其他值。
您绘制的点数太少,每个点都太小(实际上屏幕上只有1个像素大小)。您可能想要绘制圆圈或绘制一千或更多像素,然后再次检查。
顺便说一句,请格式化您的问题并让代码正常显示。
<强>编辑:强>
请参阅上面的评论。如果您没有设置有效的OpenGL上下文或者您只是不知道如何操作,请查看此http://openglbook.com/the-book/chapter-1-getting-started/并开始使用您的第一个OpenGL程序。