我正在尝试锻炼来执行以下操作:有一个点数组,通过成对的 GLfloats 表示。用户应该单击窗口中的某个点以显示另一个点。添加点时,应重新绘制窗口,并显示与线相连的点。因此,用户应该能够单击窗口的某些位置绘制线条。
在此代码中,每当单击时,我都会在向量中推送一个点,但没有添加点,所以我只看到没有点的灰色窗口(APPLE_GRAY标题中定义)。
#include <OpenGL/OpenGL.h>
#include <GLUT/GLUT.h>
#include <stdio.h>
#include <stdlib.h>
#include "utility.h"
const int width=500;
const int height=500;
GLfloat* points;
size_t size=100;
int count=0;
void pushPoint(GLfloat x, GLfloat y)
{
count++;
if(count>size)
{
size+=100;
points=(GLfloat*)realloc(points,2*size*sizeof(GLfloat));
}
points[2*count-2]=x;
points[2*count-1]=y;
}
void init()
{
points=(GLfloat*)malloc(2*size*sizeof(GLfloat));
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glLoadIdentity();
glOrtho(0, width, height, 0, 0, 1);
glViewport(0, 0, 500, 500);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
}
void display()
{
glClearColor(APPLE_GRAY);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor4f(RED);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, points);
glDrawElements(GL_LINE_LOOP,count,GL_FLOAT,points);
glFlush();
glDisableClientState(GL_VERTEX_ARRAY);
}
void mouse(int button, int state, int x, int y)
{
if(state)
{
pushPoint(x, y);
glutPostRedisplay();
}
}
void motion(int x, int y)
{
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitWindowPosition(100, 100);
glutInitWindowSize(width,height);
glutCreateWindow("Test");
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);
init();
glutMainLoop();
return 0;
}
同样,glutInitDisplayMode()
需要在glutCreateWindow()
之前调用。
GL_FLOAT
不是glDrawElements()
中type
的有效值。 此外,points
不是索引数组。
使用glDrawArrays()
:
#include <GL/glut.h>
const int width=500;
const int height=500;
GLfloat* points;
size_t size=100;
int count=0;
void pushPoint(GLfloat x, GLfloat y)
{
count++;
if(count>size)
{
size+=100;
points=(GLfloat*)realloc(points,2*size*sizeof(GLfloat));
}
points[2*count-2]=x;
points[2*count-1]=y;
}
void init()
{
points=(GLfloat*)malloc(2*size*sizeof(GLfloat));
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, height, 0, 0, 1);
glEnable(GL_DEPTH_TEST);
}
void display()
{
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3ub(255,0,0);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, points);
glDrawArrays(GL_LINE_LOOP,0,count);
glDisableClientState(GL_VERTEX_ARRAY);
glutSwapBuffers();
}
void mouse(int button, int state, int x, int y)
{
if(state)
{
pushPoint(x, y);
glutPostRedisplay();
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitWindowPosition(100, 100);
glutInitWindowSize(width,height);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Test");
glutDisplayFunc(display);
glutMouseFunc(mouse);
init();
glutMainLoop();
return 0;
}