#include <stdio.h>
#include <stdlib.h>
#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <iostream>
#include <string>
#include <SOIL\SOIL.h>
#include "shader.h"
#include <glm\glm.hpp>
//变换函数
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#define VALS_PER_VERT 3
#define NUM_VERTS 3
bool keys[1024];
glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
unsigned int programID;
unsigned int vertexVaoHandle;
unsigned int lightProgramID;
unsigned int lightVertexs;
//创建纹理ID
GLuint texture0;
GLuint texture1;
// Window dimensions
const GLuint WIDTH = 800, HEIGHT = 600;
//设置鼠标初始位置
GLfloat lastX = 400, lastY = 300;
GLfloat yaw = 0, pitch = 0;
//滚轮缩放属性 默认为45.0f
GLfloat aspect = 45.0f;
static void error_callback(int error, const char* description) {
fputs(description, stderr);
}
void do_movement();
void mouse_callback(GLFWwindow* window, double xPos, double yPos);
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset);
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
void LoadTexture(const char* imgPath) {
// 设置纹理扩展参数
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
//设置纹理的过滤方式 邻近过滤(适合于缩小) 线性过滤(适合于放大)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//纹理加载
int width, height;
//载入图片 返回宽高 数据
unsigned char* image = SOIL_load_image(imgPath, &width, &height, 0, SOIL_LOAD_RGB);
//生成纹理
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
glGenerateMipmap(GL_TEXTURE_2D);
//生成完成后释放 数据缓存
SOIL_free_image_data(image);
glBindTexture(GL_TEXTURE_2D, 0);
}
int setVertexData() {
//三个顶点-一个三角形 一个面-两个三角形 立方体-六个面
//后面两位 S T
float vertices[] = {
// positions // normals // texture coords
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f,
0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f
};
glGenVertexArrays(1, &vertexVaoHandle);
glBindVertexArray(vertexVaoHandle);
unsigned int buffer;
glGenBuffers(1, &buffer);
//数组缓存
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, NUM_VERTS, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), 0);
//此处传入 面的法向量
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
//传入贴图位置 信息
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));
//解绑 顶点数组
glBindVertexArray(0);
//这个清空会不会影响后续程序---拭目以待?开始把纹理去掉 然儿 不会影响
glBindBuffer(GL_ARRAY_BUFFER, 0);
//获取纹理内存
glGenTextures(1, &texture0);
//绑定纹理 供后续使用
glBindTexture(GL_TEXTURE_2D, texture0);
LoadTexture("container2.png");
glGenTextures(1, &texture1);
////绑定纹理 供后续使用
glBindTexture(GL_TEXTURE_2D, texture1);
LoadTexture("container2_specular.png");
glGenVertexArrays(1, &lightVertexs);
glBindVertexArray(lightVertexs);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, NUM_VERTS, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), 0);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
return 0;
}
void render() {
//清除景深 和颜色 缓存
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//设置背景颜色
glClearColor(0.2f, 0.5f, 0.6f,0.5f);
// 渲染 启用景深 深度测试
glEnable(GL_DEPTH_TEST);
//声明一个光源的位置
glm::vec3 lightPos(1.1f, 1.0f, 1.5f);
glUseProgram(programID);
glUniform1i(glGetUniformLocation(programID, "material.diffuse"), 0);
glUniform1i(glGetUniformLocation(programID, "material.specular"), 1);
glUniform1f(glGetUniformLocation(programID, "material.shininess"), 32.0f);
//纹理 加载
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture1);
//model中的坐标位置
glm::vec3 cubePosition[] = {
glm::vec3(0.0f, 0.0f, 0.0f),
glm::vec3(2.0f, 5.0f, -15.0f),
glm::vec3(-1.5f, -2.2f, -2.5f),
glm::vec3(-3.8f, -2.0f, -12.3f),
glm::vec3(2.4f, -0.4f, -3.5f),
glm::vec3(-1.7f, 3.0f, -7.5f),
glm::vec3(1.3f, -2.0f, -2.5f),
glm::vec3(1.5f, 2.0f, -2.5f),
glm::vec3(1.5f, 0.2f, -1.5f),
glm::vec3(-1.3f, 1.0f, -1.5f) };
//点光源位置信息
glm::vec3 pointLightPositions[] = {
glm::vec3(0.7f, 0.2f, 2.0f),
glm::vec3(2.3f, -3.3f, -4.0f),
glm::vec3(-4.0f, 2.0f, -12.0f),
glm::vec3(0.0f, 0.0f, -3.0f)
};
glUniform3f(glGetUniformLocation(programID, "viewerPos"), cameraPos.x, cameraPos.y, cameraPos.z);//传入观察者 坐标 就是摄像机坐标
// 在此之前不要忘记首先'使用'对应的着色器程序(来设定uniform) 给物体设置光照颜色 反射颜色
glUniform3f(glGetUniformLocation(programID, "spotLight.color"), 1.0f, 1.0f, 1.0f); // 依旧把光源设置为白色
//聚光灯是输入 目前未使用
glUniform3f(glGetUniformLocation(programID, "spotLight.position"), cameraPos.x, cameraPos.y, cameraPos.z);//传入光源位置
glUniform3f(glGetUniformLocation(programID, "spotLight.direction"), cameraFront.x, cameraFront.y, cameraFront.z);
glUniform3f(glGetUniformLocation(programID, "spotLight.ambient"), 0.2f, 0.2f, 0.2f);//传入光源位置
glUniform3f(glGetUniformLocation(programID, "spotLight.diffuse"), 0.5f, 0.5f, 0.5f);//传入光源位置
glUniform3f(glGetUniformLocation(programID, "spotLight.specular"), 1.0f, 1.0f, 1.0f);//传入光源位置
glUniform1f(glGetUniformLocation(programID, "spotLight.constant"), 1.0f);
glUniform1f(glGetUn
没有合适的资源?快使用搜索试试~ 我知道了~
OpenGL最新环境glfw+glew+glm+SOIL
共36个文件
tlog:6个
png:3个
pdb:2个
需积分: 50 19 下载量 11 浏览量
2018-03-31
22:32:39
上传
评论
收藏 18.67MB RAR 举报
温馨提示
OpenGL最新环境 Debug测试 运行 glfw+glew+glm+SOIL 还包含多光源 实例 只需要配置静态库就行了,直接运行
资源推荐
资源详情
资源评论
收起资源包目录
opengl+glew+glfw+实例.rar (36个子文件)
OpenGLEnv.rar 1.19MB
glfwdemo5
glfwdemo5
main.cpp 18KB
shader01.vert 690B
container2.png 457KB
shader.h 169B
glfwdemo5.vcxproj.filters 2KB
awesomeface.png 40KB
container.jpg 181KB
glfwdemo5.vcxproj.user 165B
light01.frag 99B
17.聚光灯+函数结构体+....zip 792KB
shader.cpp 2KB
18.多光源+自定义.zip 792KB
shader01.frag 5KB
Debug
vc141.pdb 508KB
main.obj 197KB
glfwdemo5.log 2KB
vc141.idb 387KB
glfwdemo5.tlog
link.read.1.tlog 4KB
link.command.1.tlog 1KB
CL.command.1.tlog 1KB
CL.write.1.tlog 1KB
glfwdemo5.lastbuildstate 209B
CL.read.1.tlog 48KB
link.write.1.tlog 576B
shader.obj 330KB
light01.vert 201B
glfwdemo5.vcxproj 7KB
container2_specular.png 141KB
glfwdemo5.sln 1KB
.vs
glfwdemo5
v15
ipch
AutoPCH
ad5436fc6501d2ff
MAIN.ipch 69.06MB
.suo 43KB
Browse.VC.db 20.46MB
Debug
glfwdemo5.pdb 1.28MB
glfwdemo5.ilk 1.37MB
glfwdemo5.exe 362KB
共 36 条
- 1
资源评论
todos-hah
- 粉丝: 2
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功