OpenGL第八版–初识OpenG
#include
using namespace std;
#include “stdio.h”
#include “GL\glew.h”
#include “GL\glut.h”
#include “GL\freeglut.h”
#include “LoadShaders.h”
enum vao_ids{ triangles, numvaos };
enum Buffer_ids { arrayBuffer, NumBuffers };
enum attrid_ids { vPosition = 0 };
GLuint vaos[numvaos];
GLuint Buffers[NumBuffers];
const GLuint NUMvertices = 6;
#define BUFFER_OFFSET(x) ((const void*) (x))
void init(void)
{
//分配顶点数组对象numvaos=对象个数;vaos返回的对象名的数组
glGenVertexArrays(numvaos, vaos);//返回numvaos个未使用的对象名到数组vaos中
//创建并绑定顶点数组对象
//1、如果输入的vaos 非0,并且是上一步(glGenVertexArrays)返回的,将创建一个新的顶点数组对象并且与其名称关联
//2、如果绑定到一个已经创建的顶点数组对象中,那么会激活这个顶点数组对象,并且直接影响对象中保存的顶点数组状态
//3、如果输入的vaos 为0,那么OpenGL将不再使用程序所分配的任何顶点数组对象,并且将渲染状态重设为顶点数组的默认状态
//4、如果vaos不是上一步(glGenVertexArrays)返回的,或者已经被glDeleteVertexArrays()函数释放,将产生一个GL_INVALID_OPENATION错误
glBindVertexArray(vaos[triangles]);
//glDeleteVertexArrays(GLsizei n, GLuint *arrays); 删除n个在arrays中定义的顶点数组对象
//GLboolean gllsVertexArray(GLuint array); 检查某个名称是否已经被保留为一个顶点数组对象
// 如果 array 是一个已经用 glGenVertexArrays() 创建且没有被删除的顶点数组对象的名称 则返回GL_TRUE
// 如果 array 为 0 或者不是任何顶点数组对象的名称 则 返回 GL_FALSE
//
GLfloat vertices[NUMvertices][2] = {
{-0.90f, -0.90f},
{ 0.85f, -0.90f},
{-0.90f, 0.85f},
{ 0.90f, -0.85f},
{ 0.90f, 0.90f},
{-0.85f, 0.90f}
};
//创建顶点缓存对象名称 返回 NumBuffers 个当前未使用的缓存对象名称,并保存到 Buffers 数组中(不一定是连续的整型数据)
glGenBuffers(NumBuffers, Buffers); //这里返回的对象名称只用于分配其他缓存对象,他们在绑定之后只会记录一个可用的状态
// 0 是一个保留的缓存对象名称,glGenBuffers() 永远不会返回这个值的缓存对象。
//绑定顶点缓存对象
glBindBuffer(GL_ARRAY_BUFFER, Buffers[arrayBuffer]);// GL_ARRAY_BUFFER 对象类型(OpenGL有8中类型)Buffers要绑定的对象
//完成三项工作(1)、第一次绑定Buffers,且是一个非零的无符号整型,将创建一个新的缓存对象
//(2)、绑定一个已经创建的缓存对象,将成为当前被激活的缓存对象
//(3)、绑定的 Buffers 值为 0 程序不再对 当前类型应用任何缓存对象
// 所有的缓存对象可以使用glDeleteBuffers(GLsizei n, const GLuint *buffers)函数直接释放
// GLboolean gllsBuffer(GLuint buffer); 可判断buffer是否一个缓存对象名称 返回 GL_TRUE 或者 GL_FALSE
//将顶点数据从对象传输到缓存对象中 (1)分配存储空间; (2)、从程序数组拷贝数据到服务内存
// GL_ARRAY_BUFFER 数据类型
// sizeof(vertices)存储数据总数量 = vertices中存储元素的总数 * 单位元素存储空间 超过服务端能够分配的额度 产生GL_OUT_OF_MEMORY的错误
// vertices要么是客户端内存的指针(便于初始化缓存对象)要么是NULL
// GL_STATIC_DRAW 设置分配数据之后的读写方式 设置的不可以的值出现GL_INVALID_VALUE错误
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
ShaderInfo shaders[] = {
{ GL_VERTEX_SHADER, "demo.vert" },//顶点着色器
{ GL_FRAGMENT_SHADER, "demo.frag" },//片元着色器
{ GL_NONE, NULL}
};
GLuint program = LoadShaders(shaders);
glUseProgram(program);
glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) );
glEnableVertexAttribArray(vPosition);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(vaos[triangles]);
glDrawArrays(4, 0, NUMvertices);
glFlush();
}
int main(int argc, char ** argv)
{
//初始化和创建窗口 属于VGL.H
//负责初始化GLUT库,处理向程序输入的命令行参数,并且移除其中与控制GLUT如何操作的相关部分
glutInit(&argc, argv);
//设置窗口类型
glutInitDisplayMode(GLUT_RGBA);
//设置窗口大小
glutInitWindowPosition(800, 600);
//设置OpenGL的主次版本
glutInitContextVersion(4, 3);
//设置程序的核心或兼容性
glutInitContextProfile(GLUT_CORE_PROFILE);//设置为兼容性
//创建窗口
glutCreateWindow("我的demo");
//属于GLEW辅助库的初始化函数
if (glewInit())
{
cout << "Unable to initializw GLEW.... exiting" << endl;
return 0;
}
//初始化函数
init();
//显示回调(GLUT更行窗口自动调用)
glutDisplayFunc(display);
//无限执行的循环,处理窗口和操作系统的用户输入操作
glutMainLoop();
}