OpenGL南邮计算机图形学实验报告一——图形两种颜色的渐变

OpenGL南邮计算机图形学实验报告一——图形两种颜色的渐变(红黄绿)

计算机图形学的题目要求

OpenGL配置参考:
南邮老前辈wonz哥的OpenGL配置、(Shader.h始终不用改)
学习网站:LearnOpenGL CN

思路:
1.由于要实现颜色的渐变,则设置颜色为uniform变量,并由时间来控制,调用glfwGetTime()函数。
通过glUniform4f()函数返回红绿蓝的值,(最后一个参数为透明度)。
2.要实现红黄绿的渐变,观察到红色rgb(redgreenblue)为(1,0,0)绿色rgb为(0,1,0)。则设置redvalue+greenvalue=1即可。
注:有个问题是黄色rbg为(1,1,0),即通过我上述方法无法得到纯正的黄色,是那种深黄色,欢迎大家找出好的办法!

话不多说直接上代码:
main.cpp

#include<iostream>

//GLEW
#define GLEW_STATIC
#include<GL/glew.h>

//GLFW
#include<GLFW/glfw3.h>
#include"shader.h"

const GLint WIDTH = 800, HEIGTH = 600;

int main()
{
	glfwInit();
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
	glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

	GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGTH, "Learn OpenGL", nullptr, nullptr);
	if (nullptr == window)
	{
		std::cout << "Failed to create GLFW window" << std::endl;
		glfwTerminate();
		return -1;
	}
	int screenWidth, screenHeight;
	glfwGetFramebufferSize(window, &screenWidth, &screenHeight);

	glfwMakeContextCurrent(window);
	glewExperimental = GL_TRUE;

	if (GLEW_OK != glewInit())
	{
		std::cout << "Failed to initialise GLEW" << std::endl;
		return -1;
	}
	glViewport(0, 0, screenWidth, screenHeight);

	Shader ourShader = Shader("res/shaders/core.vs", "res/shaders/core.fs");

	GLfloat vertices[] =
	{		//postion     //color
		0.5f, -0.5f, 0.0f,  1.0f, 0.0f, 0.0f,   // 右下
		-0.5f, -0.5f, 0.0f,  0.0f, 1.0f, 0.0f,   // 左下
		0.0f,  0.5f, 0.0f,  0.0f, 0.0f, 1.0f    // 顶部
	};

	GLuint VAO, VBO;
	glGenVertexArrays(1, &VAO);
	glGenBuffers(1, &VBO);
	glBindVertexArray(VAO);
	glBindBuffer(GL_ARRAY_BUFFER, VBO);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
	glEnableVertexAttribArray(0);
	glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
	glEnableVertexAttribArray(1);

	glBindBuffer(GL_ARRAY_BUFFER, 0);
	glBindVertexArray(0);

	while (!glfwWindowShouldClose(window))
	{
		glfwPollEvents();
		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);

		ourShader.Use();

		// 更新uniform颜色
		GLfloat timeValue = glfwGetTime();//获取时间
		GLfloat greenValue = sin(timeValue) / 2.0f + 0.5f;//设置颜色值范围0-1
		GLfloat redValue = 1.0f-greenValue;
		GLint vertexColorLocation = glGetUniformLocation(ourShader.Program, "ourColor");//获取uniform的位置索引
		glUniform4f(vertexColorLocation, redValue, greenValue, 0.0f, 1.0f);//该位置的像素设置颜色
		glBindVertexArray(VAO);
		glDrawArrays(GL_TRIANGLES, 0, 3);
		glBindVertexArray(0);
		glfwSwapBuffers(window);
	}
	glDeleteVertexArrays(1, &VAO);
	glDeleteBuffers(1, &VBO);
	ourShader.~Shader();
	glfwTerminate();
	return 0;
}

core.vs

 #version 330 core
layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color;
out vec3 ourColor;
void main()
{
	gl_Position = vec4(position,1.0f);
	ourColor=color;
}

core.fs

#version 330 core
out vec4 color;
uniform vec4 ourColor;
void main()
{
       color = ourColor;
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
计算机图形学综合实验报告 烟台大学 计算机学院 软件工程专业 班 级: 计103-3 学 号: 201058503334 姓 名: 公茂华 指导教师: 孔繁茹 完成日期: 2012.11.10 综合试验:太阳系模型 1. 实验目的与要求 1、学习和掌握OpenGL的使用 2、掌握矩阵堆栈的实现方法 3、根据自己的创意实现实验内容,进一步掌握和理解OpenGL的使用 2. 实验内容 1、请编写地球围绕太阳自动旋转的方式 2、请再加上一个月亮, 并围绕地球旋转,并添加轨道 3、实现用户通过键盘或鼠标加入或减少行星和卫星 3. 实验结果 1. 开始运行 2. 增加地球和月亮(按键L或l)或其他任意行星及其若干卫星 3. 按照提示用鼠标和键盘增加或减少行星和卫星 转换视角: 4. 异常提示:要将Color.txt文件放到当前文件夹下 4. 体会 通过本次试验的实践,使我更加了解和初步掌握了OpenGL的用法,对使用OpenGl 绘制球体等图形有了充分认识,并对平移矩阵堆栈和旋转矩阵堆栈的使用有了初步的 掌握。虽然以前没有接触过OpenGl,但是通过学习计算机图形学这门课程的知识,以 及通过多次上机实验,已使我对OpenGL有了一定了解,不过具体使用和其它方面还需 要进一步理解和学习。最后,感谢老师的悉心指导。 5. 源程序 注:红色注释为新加 #include <windows.h> #include <gl/glut.h> #include <stdlib.h> #include <stdio.h> #include <math.h> static float fE = 0.0f; //绕太阳或行星旋转的角度 static int i=0, j=0, m; //for循环计数 static GLint x=7, y=3; //转换视角,以太阳为中心 static int a[8]; //计数第几颗行星的卫星的数量 static bool lag = false; //键盘L(l)增加行星的标志,true为增加 int k[8][3]; //读取文件数据 FILE *fp; void Initial() { glEnable(GL_DEPTH_TEST); //启用深度测试 glClearColor(0.0, 0.0, 0.0, 0.0);//设置背景颜色 } void Change(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h);//设置视区尺寸 glMatrixMode(GL_PROJECTION); //指定当前操作投影矩阵堆栈 glLoadIdentity(); //重置投影矩阵 GLfloat fAspect; fAspect = (float)w/(float)h; gluPerspective(45, fAspect, 1.0, 600.0);//设置透视投影矩阵 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void Satellite() //增加卫星 { for (int n=0; n< a[i]; n++) { glPushMatrix(); glRotatef(30.0f+6*n, 0.0f, 0.0f, 1.0f); //绕z轴旋转30度 glRotatef(fE*10*(3*n+1), 0.0f, 1.0f, 0.0f); //公转速度fE*10*(3*n+1) glTranslated(-5.0f*m, 1.0f, 0.0f); glColor3f(256.0f, 256.0f, 0.0f); glutWireSphere(1.0f, 20, 20); //卫星 glColor3f(0.0f, 0.0f, 0.0f); glPopMatrix(); } } void Planet() //增加行星 { if (lag==true) //键盘L(l)增加行星 i=j-1; else i=0; for (;i<j;i++) { if (i<5) { if (i==3) m=1.9;//模拟火星 else m=i+1; } else m=9-i; glPushMatrix(); //保存当前的模型视图矩阵 glColor3f(0,0,9); glutWireTorus(20.0f*(i+1), 0, 100, 1); //轨道 glRotatef(fE*(9-i), 0.0f, 1.0f, 0.0f); //绕y轴旋转一定的角度 glTranslated(20.0f*(i+1), 0.0f, 0.0f); //平移一段距离 glColor3f(k[i][0], k[i][1], k[i][2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岚-岚岚岚岚岚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值