基础的光照场景添加镜面光照

镜面光照的计算方式参考:https://blog.csdn.net/auccy/article/details/82840881

镜面光照的计算(包含环境光照与漫反射光照)

void main()
{
	// ambient
    float ambientStrength = 0.1;
    vec3 ambient = ambientStrength * sunColor;
  	
    // diffuse 
    vec3 norm = normalize(Normal);
    vec3 lightDir = normalize(sunPos - FragPos);
    float diff = max(dot(norm, lightDir), 0.0);
    vec3 diffuse = diff * sunColor;
    
    //spec
    float specularStrength = 0.5;
    vec3 viewDir = normalize(viewPos - FragPos);
	vec3 reflectDir = normalize(reflect(-lightDir,norm));
	float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);
	vec3 specular = specularStrength * spec * sunColor;

    vec3 result = (ambient + diffuse+specular) * objectColor;
    FragColor = vec4(result, 1.0);
}

完整的demo代码:


#include "stdio.h"
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <soil/SOIL.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

#include <iostream>
#include "wrapperWindow.h"
#include "wrapperShader.h"
#include "data.h"
#include <windows.h>

const int design_w = 800;
const int design_h = 600;

int main()
{
	GLFWwindow *window = wrapperWindow(design_w, design_h).getWindow();

	auto objectShader = wrapperShader::createWithFilePath("object.vsh", "object.fsh");
	auto lightShader = wrapperShader::createWithFilePath("light.vsh", "light.fsh");
	int arr_group_nun = 6;


	GLuint vao, vbo;
	glGenVertexArrays(1, &vao);
	glBindVertexArray(vao);
	glGenBuffers(1, &vbo);
	glBindBuffer(GL_ARRAY_BUFFER, vbo);
	glBufferData(GL_ARRAY_BUFFER, sizeof(cubeNormalArr), cubeNormalArr, GL_STATIC_DRAW);

	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, arr_group_nun* sizeof(GLfloat), (GLvoid *)0);
	glEnableVertexAttribArray(0);

	glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, arr_group_nun* sizeof(GLfloat), (GLvoid *)(3 * sizeof(GLfloat)));
	glEnableVertexAttribArray(1);
	glBindVertexArray(0);
	//--
	glm::vec3 lightPos = glm::vec3(1.0, 1.2, 2.0);
	glEnable(GL_DEPTH_TEST);
	while (!glfwWindowShouldClose(window))
	{
		glfwPollEvents();

		glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		
		objectShader.useShaderProgram();
		objectShader.setVec3("objectColor", 1.0f, 0.5f, 0.31f);
		objectShader.setVec3("sunColor", 1.0f, 1.0f, 1.0f);
		objectShader.setVec3("sunPos", lightPos);
		objectShader.setVec3("viewPos", 0,0,0);

		glm::mat4 view;
		view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));
		objectShader.setMat4fv("view", view);

		glm::mat4 projection;
		projection = glm::perspective(glm::radians(45.0f), (float)(design_w*1.0 / design_h), 0.1f, 100.0f);
		objectShader.setMat4fv("projection", projection);

		glm::mat4 model;
		model = glm::rotate(model, /*(float)glfwGetTime()*/10.f*glm::radians(30.0f), glm::vec3(0.5f,0.7f, 0.0f));
		objectShader.setMat4fv("model", model);

		glBindVertexArray(vao);
		glDrawArrays(GL_TRIANGLES, 0, 36);
		glBindVertexArray(0);

		glfwSwapBuffers(window);
	}
	glDeleteBuffers(1, &vao);
	glDeleteBuffers(1, &vbo);
	glfwTerminate();
	return 0;
}

效果图:

相关资源:https://pan.baidu.com/s/1K41z2vksel7yTdIMnwhG-Q

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值