计算机图形学

创建窗口`

#include <iostream>
//GLEW
#define GLEW_STATIC
#include <GL/glew.h>
//GLFW
#include <GLFW/glfw3.h>
using namespace std;

//创建一个窗口,定义窗口的宽高常亮
const GLint WIDTH = 800, HEIGHT = 600;
//着色器语言,一长串字符串
//顶点着色器
//着色器语言用的是330版本
/*const GLchar *vertexShaderSource = "version 330 core\n"
"layout(location=0) in vec3 position;\n"//location is 位置,in是输入,输入3维向量vec3,起名叫position
"void main()\n"
"{\n"
"gl_Position=vec4(position.x,position.y,position.z,1.0f);\n"//glposition是着色器内部保留的变量不需声明,vec4是四维向量,齐次坐标系(x,y,z,1),最后的1必须是1
//最后不是1,需做额外的处理

"}";

//片源着色器
//与顶点着色器版本一直
const GLchar *fragmentShaderSource = "version 330 core\n"
"out vec4 color;\n"//输出Out一个4维颜色变量
"voud main()\n"
"{\n"
"color=vec4(1.0f,0.5f,0.2f,1.0f);\n"
"}";
*/
int main()
{
	//初始化GLFW
	glfwInit();
	//设置窗口
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//设置OpenGL主版本3.3之后的版本都兼容
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//设置OPenGL此版本
	//使用OPENGL核心模式
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//core profile即glew
	//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);mac系统
	//不可改变窗口大小
	glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
	//自动填充,tab跳下一个参数
	GLFWwindow *window = glfwCreateWindow(WIDTH, HEIGHT, "B17040506", nullptr, nullptr);//生成窗口,窗口大小,窗口名,是否设置全屏,基本不用
	//分辨率即像素的个数,操作系统显示一个像素用更多的像素内存,需要知道真缓存大小(在显卡里),真缓存包含颜色缓存Colar,深度缓存
	//Depth,模板缓存(画阴影)
	int screenWidth, screenHeight;
	glfwGetFramebufferSize(window, &screenWidth, &screenHeight);
	//判断窗口是否新建成功
	if (nullptr == window)
	{
		cout << "fail" << endl;
		glfwTerminate();//关闭
		return -1;

	}
	//指定当前窗口
	glfwMakeContextCurrent(window);
	//启动OPENGL
	glewExperimental = GL_TRUE;
	//检查是否启动成功
	if (GLEW_OK != glewInit())
	{
		cout << "fail" << endl;
		glfwTerminate();
		return -1;
	}
	//使用OPENGL,viewport是将真缓存显存中一致的数据映射到屏幕上的过程
	glViewport(0, 0, screenWidth, screenHeight);
	//开始画图,屏幕一秒钟闪许多次(60HZ),要刷新很多次
	//欧洲标准一秒钟刷新30帧,美25帧
	/*
	//import and compile shaders
	GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);//创建顶点着色器对象
	glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);//传递字符串
	glCompileShader(vertexShader);//编译,检查语法错误
	GLint success;
		GLchar inforLog[512];
	glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
		*/

	while (!glfwWindowShouldClose(window))//点红茶关闭窗口,值为真;不点一直执行这部分循环
	{
		//满足glfw
		glfwPollEvents();//监听鼠标键盘,调出来与键盘啊进行交互
		//人眼对绿色不敏感
		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//用颜色进行清除屏幕,RGBA,0-256个层次,用浮点数进行表示,A是指透明度0指全透明
		glClear(GL_COLOR_BUFFER_BIT);//
		glfwSwapBuffers(window);//真缓存在显卡里,显卡将真缓存映射到屏幕上需要时间,在这段时间里,同时开启另一个真缓存,即双缓存模式




	}
	glfwTerminate();
	return 0;





}
/*
画三角形即画顶点,用两个着色器即连个函数
using namespace std;



int main(int argc,char** argv[])
{
	//初始化glew
	glewExperimental = GL_TRUE;
	if (glewInit() != GLEW_OK)
	{
		std::cout << "failed to intialize GLEW" << std::endl;
		return -1;
	}

	//初始化GLFW
	glfwInit();
	//
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	//使用OPENGL核心模式
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
	//不可改变窗口大小
	glfwWindowHint(GLFW_RESIZABLE ,GL_FALSE);

	//创建窗口对象
	//指定窗口宽高
	int screen_width = 800;
	int screen_height = 720;
	//后面两个参数表示是否使用全屏模式和共享上下文的窗口
	GLFWwindow *window = glfwCreateWindow(screen_width, screen_height, "computer graphics", nullptr, nullptr);
	//如果窗口创建失败,输出failed to create opengl context
	if (window == nullptr)
	{
		cout << "failed to create opengl context" <<endl;
		glfwTerminate();
		return -1;

	}
	//将窗口的上下文设置为当前线程的主上下文,即将窗口设置为当前正在使用的
	//glfwMakeContextCurrent(window);

	//创建视口
	//int width, height;
	//从gLFW中获取控制渲染窗口的宽高(像素)
	//glfwGetFramebufferSize(window, &width, &height);
	//用glViewPort函数设置窗口的维度
	//glViewport(0, 0, width, height);

	//游戏循环,在GLFW退出前一直保持运行
	while (!glfwWindowShouldClose(window))
	{
		glfwPollEvents();//检查有无触发事件,如键盘输入鼠标移动等
		//渲染指令
		//设置清空屏幕所用的颜色,状态设置函数
		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
		//清除颜色缓冲,状态应用函数
		glClear(GL_COLOR_BUFFER_BIT);
		glfwSwapBuffers(window);//交换颜色缓冲
	}

	//释放为GLFW分配的内存
	glfwTerminate();
	return 0;
}
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值