#include
#include
#include
#include
#include
#include
#define SIZE_X 500
#define SIZE_Y 500
int winID;
int program;
GLuint vTest;
GLfloat test = 200.0;
GLuint vAng;
GLfloat ang = 0.0;
const GLchar* readShader( const char *filename );
void display(void)
{
static const GLfloat black[] = { 0.0f, 0.0f, 0.0f, 1.0f };
glClearBufferfv(GL_COLOR, 0, black );
glDrawArrays(GL_POINTS, 0, 1);
glutSwapBuffers();
}
void idle(void)
{
usleep(10000);
ang += 0.05;
glVertexAttrib1f( vAng, ang );
glutPostRedisplay();
}
void reshape(int Width,int Height)
{
glViewport(0, 0, Width, Height); //视口范围
}
void keypress(unsigned char key, int mousex, int mousey)
{
switch (key)
{
case 'q':
glutDestroyWindow(winID);
exit(0);
break;
case 'Q':
glutDestroyWindow(winID);
exit(0);
break;
case ']':
test += test*0.1;
glVertexAttrib1f( vTest, test );
glutPostRedisplay();
break;
case '[':
test -= test*0.1;
glVertexAttrib1f( vTest, test );
glutPostRedisplay();
break;
}
}
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
//允许修改点元素大小
glEnable(GL_PROGRAM_POINT_SIZE);
srand(time(NULL));
}
int loadShader(void)
{
// Very Important !
glewInit();
const GLchar * vs_src;
const GLchar * fs_src;
vs_src = readShader( "pointTest.vert" );
fs_src = readShader( "pointTest.frag" );
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vs_src, NULL);
glCompileShader(vs);
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, &fs_src, NULL);
glCompileShader(fs);
program = glCreateProgram();
glAttachShader(program, vs);
glAttachShader(program, fs);
glLinkProgram(program);
glUseProgram(program);
vTest = glGetAttribLocation( program, "vTest" );
glVertexAttrib1f( vTest, test );
printf("%d\n", vTest);
vAng = glGetAttribLocation( program, "vAng" );
glVertexAttrib1f( vAng, ang );
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
//显示模式 双缓冲 RGBA
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(SIZE_X, SIZE_Y); //窗口大小
glutInitWindowPosition(10, 10); //位置
winID = glutCreateWindow("Simple"); //窗口句柄
init();
loadShader();
glutDisplayFunc(display); //显示
glutKeyboardFunc(keypress); //按键事件响应
glutReshapeFunc(reshape); //窗口事件响应
glutIdleFunc(idle); //闲时回调函数
glutMainLoop(); //开始主循环
return 0;
}
const GLchar* readShader( const char *filename )
{
FILE *FILE = fopen(filename, "rb");
GLchar *source;
int size;
fseek( FILE, 0, SEEK_END );
size = ftell(FILE) + 1;
fseek( FILE, 0, SEEK_SET ); //turn back
source = (GLchar *) malloc( sizeof(GLchar) * size );
fread( source, 1, size, FILE);
return (const GLchar*)(source); //强制转换
}