OpenGL3画圆

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <math.h>
#include <iostream>

using namespace std;

const GLfloat PI = 3.24250265357f;
const float r = 0.5f;
float vertex[300];

void framebuffer_size_callback(GLFWwindow* window, int width, int height);

int main()
{
	glfwInit();
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
	auto window = glfwCreateWindow(800, 800, "glwindow", NULL, NULL);
	if (window == NULL)
	{
		glfwTerminate();
		return -1;
	}
	glfwMakeContextCurrent(window);//创建窗口
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) return -1;//初始化GLAD
	glfwSetFramebufferSizeCallback(window,framebuffer_size_callback);//根据窗口调整视口

	for (int i = 0; i < 100; i++)
	{
		vertex[i * 3] = r*cos(i*PI / 50);
		vertex[i * 3 + 1] = r*sin(i*PI / 50);
		vertex[i * 3 + 2] = 0.0f;
	}
	//生成并绑定VBO
	GLuint v_buf_obj;
	glGenBuffers(1, &v_buf_obj);
	glBindBuffer(GL_ARRAY_BUFFER, v_buf_obj);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertex), vertex, GL_STATIC_DRAW);
	//生成并绑定VAO
	GLuint v_arr_obj;
	glGenVertexArrays(1, &v_arr_obj);
	glBindVertexArray(v_arr_obj);
	//设置顶点属性指针
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
	glEnableVertexAttribArray(0);
	glBindVertexArray(0);
	glBindBuffer(GL_ARRAY_BUFFER, 0);
	//顶点着色器源码
	const char *vertex_shader_source =
		"#version 330 core\n"
		"layout (location=0) in vec3 aPos;\n"
		"void main()\n"
		"{\n"
		"	gl_Position=vec4(aPos,1.0);\n;"
		"}\n\0";
	//片段着色器源码
	const char *fragment_shader_source =
		"#version 330 core\n"
		"out vec4 FragColor;\n"
		"void main()\n"
		"{\n"
		"	FragColor=vec4(1.0f,0.5f,0.2f,.0f);\n"
		"}\n\0";
	//创建着色器对象
	int vertSahder, fragShader;//顶点着色器,片元着色器
	vertSahder = glCreateShader(GL_VERTEX_SHADER);
	fragShader = glCreateShader(GL_FRAGMENT_SHADER);
	glShaderSource(vertSahder, 1, &vertex_shader_source, NULL);
	glShaderSource(fragShader, 1, &fragment_shader_source, NULL);
	//编译着色器
	glCompileShader(vertSahder);
	glCompileShader(fragShader);
	int status;
	glGetShaderiv(vertSahder, GL_COMPILE_STATUS, &status);
	if (!status) cout << "顶点着色器编译失败";
	glGetShaderiv(fragShader, GL_COMPILE_STATUS, &status);
	if (!status) cout << "片元着色器编译失败";
	//使用着色器程序
	int program = glCreateProgram();
	glAttachShader(program, vertSahder);
	glAttachShader(program, fragShader);
	glLinkProgram(program);
	glGetProgramiv(program, GL_LINK_STATUS, &status);
	if (!status){
		cout << "程序链接失败";
	}
	glDeleteShader(vertSahder);
	glDeleteShader(fragShader);
	while (!glfwWindowShouldClose(window))
	{
		glClearColor(0.0f, 0.3f, 0.6f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);
		glUseProgram(program);
		//绘制
		glBindVertexArray(v_arr_obj);
		glDrawArrays(GL_LINE_LOOP, 0, 100);
		glBindVertexArray(0);
		glfwSwapBuffers(window);//交换颜色缓冲
		glfwPollEvents();
	}
	
	glUseProgram(0);
	glDeleteProgram(program);
	glDeleteVertexArrays(1,&v_arr_obj);
	glDeleteBuffers(1, &v_buf_obj);
	glfwTerminate();//释放所有资源
	return 0;
}

void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
	glViewport(0, 0, width, height);
}

我自己编译GLFW的时候总是出错,所以我干脆直接在官网下载的预编译好的,64位的老是报未定义标识符错,后来改32位就没有问题。

OpenGL是一种跨平台的图形库,可以用于创建2D和3D图形应用程序。要使用OpenGL绘制鼠标画圆,你需要以下步骤: 1. 初始化OpenGL环境:包括创建窗口、设置视口等。 2. 设置鼠标回调函数:用于获取鼠标的位置信息。 3. 在绘制循环中,根据鼠标位置和用户输入来计算的半径和中心点。 4. 使用OpenGL的绘制函数来绘制。 下面是一个简单的示例代码,演示了如何使用OpenGL绘制鼠标画圆: ```cpp #include <GL/glut.h> #include <cmath> int centerX, centerY; // 心坐标 int radius = 0; // 的半径 void display() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); // 设置颜色为白色 glBegin(GL_LINE_LOOP); for (int i = 0; i < 360; i++) { float angle = i * 3.14159 / 180; float x = centerX + radius * cos(angle); float y = centerY + radius * sin(angle); glVertex2f(x, y); } glEnd(); glFlush(); } void reshape(int width, int height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, width, height, 0); } void mouse(int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { centerX = x; centerY = y; } } void motion(int x, int y) { radius = sqrt(pow(x - centerX, 2) + pow(y - centerY, 2)); glutPostRedisplay(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500, 500); glutCreateWindow("OpenGL Mouse Circle"); glClearColor(0.0, 0.0, 0.0, 1.0); // 设置背景颜色为黑色 glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); glutMotionFunc(motion); glutMainLoop(); return 0; } ``` 这段代码使用了OpenGL的固定函数管线来绘制形。在鼠标按下时,记录鼠标位置作为心;在鼠标移动时,根据鼠标位置计算半径,并重新绘制形。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值