opengl材质与光属性和键盘鼠标控制的优化

该博客介绍了在OpenGL中如何通过键盘鼠标控制优化交互,并利用光效随时间变化来增强视觉体验。通过监听Q键激活鼠标回调函数,实现相机视角的调整。同时,详细展示了如何在片段着色器中定义和应用材质与光的属性,以实现物体表面的镜面反射效果。通过对光源颜色的动态调整,使光照效果更加逼真,增强了游戏或图形应用的真实感。
摘要由CSDN通过智能技术生成
  • 键盘鼠标控制优化,按Q之后才触发将回调函数给window进程
void processInput(GLFWwindow* window) {
    
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)  //当我们获取了ESC键就退出窗口
        glfwSetWindowShouldClose(window, true);

    if (glfwGetKey(window, GLFW_KEY_Q) == GLFW_PRESS) { //按Q的时候才触发将回调函数给window进程
    //使用glfw内部窗口函数对window里边的值在鼠标进行操作的时候进行修改。  
        glfwSetCursorPosCallback(window, mouse_callback);  //  当我们有鼠标信息的时候就会进来,然后进行操作以此修改cameraFront进一步改变view
        glfwSetScrollCallback(window, scroll_callback);    //fov用于修改透视投影
    }
    

    float cameraSpeed = 2.5f*deltaTime;  //定义速度,控制位置

    if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)
        camera.Position +=cameraSpeed* camera.Front;
    if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)
        camera.Position -= cameraSpeed * camera.Front;
    if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
        camera.Position -= glm::normalize(glm::cross(camera.Front,camera.UP))* cameraSpeed;  //左右方向变化用到叉乘
    if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
        camera.Position += glm::normalize(glm::cross(camera.Front, camera.UP)) * cameraSpeed;
}
  • 我们用的一般是物体本身的颜色其实镜面反射会被光的颜色影响,所以我们对物体的片段着色器进行如下修改并且封装一下材质与光的属性在这里插入图片描述
#version 400 core
out vec4 FragColor;
in vec3 Normal;
in vec3 FragPos;
uniform vec3 lightColor;
uniform vec3 objectColor;
uniform vec3 lightPos;
uniform vec3 viewPos;

//材料的结构体
struct Material{
	vec3 ambient;
	vec3 diffuse;
	vec3 specular;
	float shininess; //影响聚光度的(发散或者聚焦)
};
Material material;
//光的结构体(属性)
struct Light{
	vec3 position;
	vec3 ambient;
	vec3 diffuse;
	vec3 specular;
};
Light light;
void main()
{
	//材质光
	material.ambient = objectColor;
	material.diffuse =	objectColor;
	material.specular = vec3(0.6f,0.6f,0.6f);	//反光的时候和物体颜色应该不一样
	material.shininess = 32;
	//环境光
	light.position = lightPos;
	light.ambient	=vec3(0.2);
	light.diffuse	=vec3(0.5);
	light.specular	=vec3(1.0);

	vec3 lightDirction = normalize(lightPos - FragPos);	//求出点到光源的方向向量
	float diffuse = max(dot(Normal,lightDirction),0.0);	//漫反射计算

	vec3 viewDirction = normalize(viewPos - FragPos);
	vec3 reflectDirction = reflect(-lightDirction,Normal);
	float specular = pow(max(dot(reflectDirction,viewDirction),0.0),32);	//高光计算=反射光和实现的点乘的X次方
	
	FragColor = vec4((light.ambient*material.ambient
		+diffuse*light.diffuse*material.diffuse
		+specular*light.specular*material.specular)*lightColor, 1.0);	//因为引入了物体颜色(橙色)时候已经乘过了所以就不用乘以objectclor
}
  • 优化一下让光的颜色随着时间发生变化(光源也要变化才显得真实)
//将main函数中的lightcolor函数变成如下效果
float timeChange =glfwGetTime();  //让光的颜色随着时间发生变化
glUniform3f(glGetUniformLocation(cubeShader.ID, "lightColor"),sin( timeChange *1.0f), sin(timeChange*0.7f),sin( timeChange * 1.3f));
//注意这里是对光源立方体进行着色修改是另一个shader了
lightShader.useShader();    //注意这是光源的useShader了
glUniform3f(glGetUniformLocation(cubeShader.ID, "lightColor"), sin(timeChange * 1.0f), sin(timeChange * 0.7f), sin(timeChange * 1.3f));
//当然光源的片段着色器也要进行传参与修改
#version 400 core
out vec4 FragColor;
in vec2 TexCoord;
in vec3 FragPos;
uniform vec3 lightColor;
uniform sampler2D ourTexture1;
uniform sampler2D ourTexture2;
void main()
{
	FragColor = vec4(lightColor,1.0);
}
  • 效果如下请添加图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值