OpenGL 学习笔记 - 基本概念

OpenGL 学习笔记- 基本概念

  • 参考:https://ke.qq.com/course/427748
  • 学习参考网址:
  • opengl就是一个大的状态机(上下文),表示当前绘制的状态(光照设置,纹理设置,材质设置)
    • GLFW 生成窗口,将上下文(context)告诉窗口,跨平台
    • GLAD 在窗口中绘图,支持不同软硬件环境

  • 输入3D坐标,输出2D 像素
  • 图中着色器是可编程的,灰色表示已经写好了,不需要写
  • VAO管理VBO

  • GL_STATIC_DRAW:数据不会或几乎不会改变。
  • GL_DYNAMIC_DRAW:数据会被改变很多。
  • GL_STREAM_DRAW:数据每次绘制时都会改变。
  • 步骤:
    • 将着色器源码存入字符串
    • 创建着色器对象
    • 将源码字符串赋予着色器对象
    • 编译着色器
    • 创建着色器程序对象
    • 将编译好的着色器附加到程序对象上
    • 链接生成程序
  • VAO\ VBO \EBO

  • 代码参考
  • main.cpp
#include <glad\glad.h>
#include "Shader.h"
#include <GLFW/glfw3.h>
#include <cstdio>

float vertices[] = {
	-0.5f,-0.5f,0.0f,//left,down
	 0.5f,-0.5f,0.0f,//right,down
	 0.5f, 0.5f,0.0f,//right,top
	-0.5f, 0.5f,0.0f//left,top
};
unsigned int indices[] = {
	0,1,3,
	1,2,3
};

GLFWwindow* window;
void init();
void VAOSet();

int main()
{
	init();
	VAOSet();
	//渲染引擎
	Shader myShader;
	glPolygonMode(GL_FRONT_AND_BACK,GL_FILL/*GL_LINE*/);
	while (!glfwWindowShouldClose(window))
	{
		//设置颜色
		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);
		myShader.useShader();

		//glUseProgram(shaderProgram);//使用程序
		//glDrawArrays(GL_TRIANGLES,0,6);//画三角
		glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

		//接收事件
		glfwPollEvents();

		//交换缓存区
		glfwSwapBuffers(window);
	}
	//退出
	glfwTerminate();
	return 0;
}
void VAOSet()
{
	unsigned int VBO, VAO, EBO;//ID

	//生成VAO
	glGenVertexArrays(1, &VAO);

	//生成VBO
	glGenBuffers(1, &VBO);
	glGenBuffers(1, &EBO);

	//绑定VAO
	glBindVertexArray(VAO);

	//绑定一种类型缓冲,VBO
	glBindBuffer(GL_ARRAY_BUFFER, VBO);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);

	//往显卡写值,分配显存空间GL_STATIC_DRAW表示,值不修改
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

	//告诉显卡,值的结构
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
	glEnableVertexAttribArray(0);
}
void init()
{
	//初始化
	glfwInit();

	//设置版本
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);

	//设置模式
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

	//创建窗口
	window = glfwCreateWindow(800, 600, "OPENGL", NULL, NULL);
	if (window == NULL)
	{
		printf("err:windows is NULL");

		//退出
		glfwTerminate();
		return;
	}

	//将窗口与上下文绑定
	glfwMakeContextCurrent(window);

	//初始化glad
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
	{
		printf("err:gladLoadGLLoader is NULL");
		return;
	}
}
  • shader.h
#pragma once
#include <glad\glad.h>
#include <stdio.h>
class Shader
{
public:
	int shaderProgram;
	void useShader();
	Shader(void);
	~Shader(void);
};
  • shader.cpp
#include "Shader.h"


Shader::Shader(void)
{
	const char * vertexShaderSource="#version 400 core\n"
		"layout(location=0) in vec3 aPos;\n"
		"void main()\n"
		"{\n"
		"gl_Position=vec4(aPos.x,aPos.y,aPos.z,1.0f);\n"
		"}\n\0";


	const char * fragmentShaderSource="#version 400 core\n"
		"out vec4 FragColor;\n"
		"void main()\n"
		"{\n"
		"FragColor=vec4(1.0f,0.5f,0.2f,1.0f);\n"
		"}\n\0";
	int vertexShader=glCreateShader(GL_VERTEX_SHADER);//创建着色器对象
	glShaderSource(vertexShader,1,&vertexShaderSource,NULL);//绑定源码
	glCompileShader(vertexShader);//编译着色器对象

	int fragmentShader=glCreateShader(GL_FRAGMENT_SHADER);//创建着色器对象
	glShaderSource(fragmentShader,1,&fragmentShaderSource,NULL);//绑定源码
	glCompileShader(fragmentShader);//编译着色器对象


	shaderProgram=glCreateProgram();//创建程序
	glAttachShader(shaderProgram,vertexShader);//附加着色器对象
	glAttachShader(shaderProgram,fragmentShader);//附加着色器对象
	glLinkProgram(shaderProgram);//链接生成程序
}

void Shader::useShader()
{
	glUseProgram(shaderProgram);
}

Shader::~Shader(void)
{
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值