#include<glad/glad.h>
#include<GLFW/glfw3.h>
#include<glm/glm.hpp>
#include<glm/matrix.hpp>
#include<glm/gtc/type_ptr.hpp>
#define STB_IMAGE_IMPLEMENTATION
#include<stb/stb_image.h>
#include<iostream>
//定义窗口大小属性
#define W_width 800
#define W_height 600
//顶点着色器
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 = projectionview*model*vec4(aPos, 1.0f);\n"
" texCoord = aTexCoord; \n"
"} \n"
;
//片段着色器
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"
;
//回调函数
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0,0, width, height);
}
int main()
{
//glfw初始化
glfwInit();
glfwWindowHint(GLFW_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//创建glfw窗口
GLFWwindow* window = glfwCreateWindow(W_width, W_height, "3D", NULL, NULL);
if(!window)
{
std::cout<<"failed to create window!" << std::endl;
return -1;
}
//glfw窗口上下文绑定当前线程上下文
glfwMakeContextCurrent(window);
//设置帧缓冲大小回调函数
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//初始化glad
if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout<< "failed to loader glad !"<< std::endl;
return -1;
}
glEnable(GL_DEPTH_TEST);
//编译顶点着色器
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 shader: "<<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 shader: "<<infoLog<<std::endl;
return -1;
}
//链接项目
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if(!success)
{
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
std::cout<< "failed to link shader: "<<infoLog<<std::endl;
return -1;
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
//创建纹理
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_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_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_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
std::cout<< "failed to load photo"<<std::endl;
}
stbi_image_free(data);
//创建顶点属性数组
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, 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, 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, 1.0f,
-0.5f, 0.5f, -0.5f, 0.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, 1.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f
};
GLuint indices[] = {
0, 1, 2,
2, 3, 1,
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
};
//创立VAO, VBO, EBO
GLuint VAO, VBO, EBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
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);
//绑定纹理
glUseProgram(shaderProgram);
GLuint texLoaction = glGetUniformLocation(shaderProgram, "texture1");
glUniform1i(texLoaction, 0);
while(!glfwWindowShouldClose(window))
{
glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE0, texture1);
glm::mat4 model = glm::mat4(1.0f);
glm::mat4 view = glm::mat4(1.0f);
glm::mat4 projection = glm::mat4(1.0f);
view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));
projection = glm::perspective(glm::radians(45.0f), (float)W_width/(float)W_height, 0.1f, 100.0f);
glUseProgram(shaderProgram);
GLuint viewLocation = glGetUniformLocation(shaderProgram, "view");
GLuint projLocation = glGetUniformLocation(shaderProgram, "projection");
glUniformMatrix4fv(viewLocation, 1, GL_FALSE, glm::value_ptr(view));
glUniformMatrix4fv(projLocation, 1, GL_FALSE, glm::value_ptr(projection));
model = glm::rotate(model, (float)glfwGetTime()*glm::radians(45.0f), glm::vec3(0.5f, 1.0f, 0.0f));
GLuint modelLocation = glGetUniformLocation(shaderProgram, "model");
glUniformMatrix4fv(modelLocation, 1, GL_FALSE, glm::value_ptr(model));
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
glfwSwapBuffers(window);
glfwPollEvents();
}
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
glDeleteBuffers(1, &EBO);
glfwTerminate();
return 0;
}
最新发布