// tutorial2.cpp : 定义控制台应用程序的入口点。
/*
这里一定要注意include的顺序
#include "stdafx.h"一定要放在最顶端!
#include <GL/glew.h>一定要放在#include <GL/freeglut.h>之前!!
*/
#include "stdafx.h"
#pragma comment(lib, "glew32.lib")
#include <GL/glew.h>
#include <ogldev_math_3d.h>
#include <GL/freeglut.h>
GLuint VBO;//定义一个全局的GLuint引用变量,来操作顶点缓冲器对象--GLuint 就是正整形,和C里面的unsigned int 一样
static void RenderSceneCB(){
glClear(GL_COLOR_BUFFER_BIT);//清空颜色缓存
glEnableVertexAttribArray(0);//开启顶点属性
glBindBuffer(GL_ARRAY_BUFFER, VBO);//绑定缓冲区
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);//管线如何在缓冲区内部解释数据,第一个参数指定索引,第二个参数构成属性的分量个数(X,Y,Z共3个)第三个参数指定每个分量的数据类型 第四个指定在管线使用前是否与要规范化 第五个参数表示两个相同属性的间隔(步长) 第六个参数缓存区中存储数据的偏移值
glDrawArrays(GL_POINTS, 0, 2);绘制 第一个参数:绘制类型为gl_points 画点,第二个参数 第一个顶点的索引值 第三个参数 画点个数,
glDisableVertexAttribArray(0);//当不需要使用顶点时 禁用顶点
glutSwapBuffers();
}
static void CreateVertexBuffer()
{
// 创建含有一个顶点的顶点数组
Vector3f Vertices[2];
// 画两个点
Vertices[0] = Vector3f(0.0f, 0.0f, 0.0f);
Vertices[1] = Vector3f(0.1f, 0.1f, 0.1f);
// 创建缓冲器---glGenBuffers(NUM_BUFFER,buffers);
glGenBuffers(1, &VBO);
// 绑定GL_ARRAY_BUFFER缓冲器
glBindBuffer(GL_ARRAY_BUFFER, VBO);
//填充buffer数据 gl_static_draw/gl_dynamic_draw 指定画的方式
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
}
int main(int argc, char **argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(1024, 768);
glutInitWindowPosition(100, 100);
glutCreateWindow("Tutorial 02");
glutDisplayFunc(RenderSceneCB);
GLenum res = glewInit();
if (res != GLEW_OK){
fprintf(stderr, "Error '%s'\n", glewGetErrorString(res));
return 1;
}
// 缓存清空后的颜色值
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
// 创建顶点缓冲器
CreateVertexBuffer();
// 通知开始GLUT的内部循环
glutMainLoop();
return 0;
}