#include<glad/glad.h>
#include<GLFW/glfw3.h>
#include<glm/glm.hpp>
#include<glm/gtc/matrix_transform.hpp>
#include<glm/gtc/type_ptr.hpp>
#include<iostream>
#define STB_IMAGE_IMPLEMENTATION
#include<stb/stb_image.h>
/*******************************************************宏***************************************************************/
#define W_width 800
#define W_height 600
/************************************************************************************************************************/
/*******************************************************全局变量*********************************************************/
bool firstMouse = true;
float lastx = W_width / 2;
float lasty = W_height / 2;
float yaw = -90.0f;
float pitch = 0.0f;
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);
float fov = 45.0f;
/************************************************************************************************************************/
/*******************************************************自定义函数*******************************************************/
void inputProcess(GLFWwindow* window)
{
if(glfwGetKey(window, GLFW_KEY_ESCAPE)==GLFW_PRESS)
{
glfwSetWindowShouldClose(window, true);
}
}
/************************************************************************************************************************/
/*******************************************************回调函数*********************************************************/
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
void cursorpos_callback(GLFWwindow* window, double xpos, double ypos)
{
if(firstMouse)
{
lastx = xpos;
lasty = ypos;
firstMouse = false;
}
float xoffest = xpos - lastx;
float yoffest = lasty - ypos;
lastx = xpos;
lasty = ypos;
float sensitivity = 0.005f;
xoffest *= sensitivity;
yoffest *= sensitivity;
yaw += xoffest;
pitch += yoffest;
if(pitch>89.0f)
{
pitch = 89.0f;
}
if(pitch<-89.0f)
{
pitch = -89.0f;
}
glm::vec3 front = glm::vec3(1.0f);
front.x = cos(glm::radians(pitch)) * cos(glm::radians(yaw));
front.y = sin(glm::radians(pitch));
front.z = cos(glm::radians(pitch)) * sin(glm::radians(yaw));
front = glm::normalize(front);
cameraFront = front;
}
void scroll_callback(GLFWwindow* window, double xoffest, double yoffest)
{
fov -= (float)yoffest;
if(fov>45.0f)
{
fov = 45.0f;
}
if(fov<1.0f)
{
fov = 1.0f;
}
}
/************************************************************************************************************************/
/*******************************************************glsl*************************************************************/
//vertexshader
const char* vertexShaderSource = "#version 330 core \n"
"layout (location = 0) in vec3 aPos; \n"
"layout (location = 1) in vec2 aTex; \n"
"uniform mat4 model; \n"
"uniform mat4 view; \n"
"uniform mat4 projection; \n"
"out vec2 texCoord; \n"
"void main() \n"
"{ \n"
" gl_Position = projection * view * model * vec4(aPos, 1.0f); \n"
" texCoord = aTex; \n"
"} \n"
;
//fragmentshader
const char* fragmentShaderSource = "#version 330 core \n"
"in vec2 texCoord; \n"
"uniform sampler2D texture1; \n"
"out vec4 fragColor; \n"
"void main() \n"
"{ \n"
" fragColor = texture(texture1, texCoord); \n"
"} \n"
;
//lightvershader
//lightfragshader
/************************************************************************************************************************/
int main()
{
/*******************************************************GLFW启动*********************************************************/
//glfw初始化
glfwInit();
//glfw版本配置,模式选择
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//glfw上下文创建
GLFWwindow* window = glfwCreateWindow(W_width, W_height, "地形", NULL, NULL);
if(!window)
{
std::cout<< "failed to create window" <<std::endl;
return -1;
}
//glfw上下文绑定当前线程上下文
glfwMakeContextCurrent(window);
//设置回调函数
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
glfwSetScrollCallback(window, scroll_callback);
glfwSetCursorPosCallback(window, cursorpos_callback);
//设置鼠标指针隐藏
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
/************************************************************************************************************************/
/*******************************************************GLAD启动*********************************************************/
//glad登录
if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout<< "failed to load glad" <<std::endl;
glfwTerminate();
return -1;
}
//启动深度测试
glEnable(GL_DEPTH_TEST);
/************************************************************************************************************************/
/*******************************************************SHADER编译*******************************************************/
//编译顶点着色器
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
int success;
char infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
if(!success)
{
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
std::cout<< "failed to compile vertexShader :" << infoLog <<std::endl;
return -1;
}
//编译片段着色器
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
if(!success)
{
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
std::cout<< "failed to compile fragmentShader :" << infoLog <<std::endl;
return -1;
}
//链接着色器程序
GLuint shaderProgram1 = glCreateProgram();
glAttachShader(shaderProgram1, vertexShader);
glAttachShader(shaderProgram1, fragmentShader);
glLinkProgram(shaderProgram1);
glGetProgramiv(shaderProgram1, GL_LINK_STATUS, &success);
if(!success)
{
glGetProgramInfoLog(shaderProgram1, 512, NULL, infoLog);
std::cout<< "failed to link shaderProgram :" << infoLog <<std::endl;
return -1;
}
//删除着色器
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
/************************************************************************************************************************/
/*******************************************************TEXTURE建立******************************************************/
//创建纹理变量
GLuint texture1;
glGenTextures(1, &texture1);
//绑定纹理
glBindTexture(GL_TEXTURE_2D, texture1);
//设置纹理
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_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//获取纹理
int width, height, nrchannel;
stbi_set_flip_vertically_on_load(true);
unsigned char* data = stbi_load("muxiang.png", &width, &height, &nrchannel, 0);
if(data)
{
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
std::cout<< "failed to load texture" <<std::endl;
return -1;
}
//释放data指向的内存
stbi_image_free(data);
//导入OpenGL
GLuint texLocation = glGetUniformLocation(shaderProgram1, "texture1");
glUniform1i(texLocation, 0);
/************************************************************************************************************************/
/*******************************************************vertex数组*******************************************************/
float vertices[] = {
//坐标 //纹理
//正面
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 1.0f,
//反面
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
//上面
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
//下面
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
0.5f, -0.5f, -0.5f, 1.0f, 1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
//左面
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
//右面
0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
0.5f, 0.5f, 0.5f, 0.0f, 1.0f
}
;
GLuint indices[] = {
//正面
0, 1, 2, 2, 3, 0,
//反面
4, 5, 6, 6, 7, 4,
//上面
8, 9, 10, 10, 11, 8,
//下面
12, 13, 14, 14, 15, 12,
//左面
16, 17, 18, 18, 19, 16,
//右面
20, 21, 22, 22, 23, 20
}
;
/************************************************************************************************************************/
/*******************************************************vertex属性*******************************************************/
//创建vao,vbo,ebo
GLuint VAO, VBO, EBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);
//绑定vao,vbo,ebo
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
//设置顶点属性
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5*sizeof(float), (void*)(3*sizeof(float)));
glEnableVertexAttribArray(1);
/************************************************************************************************************************/
/*******************************************************循环主体*********************************************************/
while(!glfwWindowShouldClose(window))
{
inputProcess(window);
glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(shaderProgram1);
glBindVertexArray(VAO);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture1);
glm::mat4 view = glm::mat4(1.0f);
glm::mat4 projection = glm::mat4(1.0f);
projection = glm::perspective(glm::radians(fov), (float)W_width/(float)W_height, 0.1f, 100.0f);
view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
GLuint projLcation = glGetUniformLocation(shaderProgram1, "projection");
GLuint viewLocation = glGetUniformLocation(shaderProgram1, "view");
glUniformMatrix4fv(projLcation, 1, GL_FALSE, glm::value_ptr(projection));
glUniformMatrix4fv(viewLocation, 1, GL_FALSE, glm::value_ptr(view));
glm::mat4 model = glm::mat4(1.0f);
GLuint modelLocation = glGetUniformLocation(shaderProgram1, "model");
glUniformMatrix4fv(modelLocation, 1, GL_FALSE, glm::value_ptr(model));
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glfwSwapBuffers(window);
glfwPollEvents();
}
/************************************************************************************************************************/
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
glDeleteBuffers(1, &EBO);
glfwTerminate();
return 0;
}
最新发布