OpenGL第八版--初识OpenG

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();

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值