#include<glad/glad.h>
#include<GLFW/glfw3.h>
#include<stdio.h>
#include<errno.h>
#include<math.h>
#include<stdbool.h>
#define STB_IMAGE_IMPLEMENTATION
#include"stb/stb_image.h"
#define Wwidth 1080
#define Wheight 960
//顶点着色器源码
const char* vertexShaderSource = "#version 330 core \n"
"layout ( location = 0 ) in vec3 aPos; \n" //顶点位置
"layout ( location = 1 ) in vec3 aColor;\n" //顶点颜色
"layout ( location = 2 ) in vec2 aText; \n" //纹理坐标
"out vec3 verColor; \n"
"out vec2 verText; \n"
"void main() \n"
"{ \n"
" gl_Position = vec4(aPos, 1.0f); \n"
" verColor = aColor; \n"
" verText = aText; \n"
"} \n"
;
//片段着色器源码
const char* fragmentShaderSource = "#version 330 core \n"
"in vec3 verColor; \n"
"in vec2 verText; \n"
"uniform sampler2D ourTexture; \n"
"out vec4 FragColor; \n"
"void main() \n"
"{ \n"
" FragColor = texture(ourTexture, verText);\n"
"} \n"
;
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
int main()
{
//初始化并配置glfw
if(!glfwInit())
{
perror("failed to init glfw");
return -1;
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//创建glfw上下文窗口
GLFWwindow* window = glfwCreateWindow(Wwidth, Wheight, "纹理", NULL, NULL);
if (!window)
{
printf("failed to create glfw window");
return -1;
}
//将当前glfw窗口上下文绑定到当前线程上下文
glfwMakeContextCurrent(window);
//设置帧缓冲回调函数
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//启动glad
if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
printf("failed to load glad");
return -1;
}
//启动顶点着色器
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);
printf("%s\n", infoLog);
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);
printf("%s\n", infoLog);
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);
printf("%s\n", infoLog);
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
/*************************************************************************************************************/
//顶点属性数组
float vertices[] = { //顶点坐标 //顶点颜色 //纹理坐标
-0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
-0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f
};
//索引数组
GLuint indices[] = {
0, 1, 2,
2, 3, 0
};
//创建 顶点数组对象, 顶点缓冲对象, 索引缓冲对象
GLuint VAO, VBO, EBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);
//绑定顶点数组对象
glBindVertexArray(VAO);
//绑定顶点缓冲对象
glBindBuffer(GL_ARRAY_BUFFER, VBO);
//填充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, 8*sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
//设置顶点颜色属性,并启用
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void*)(3*sizeof(float)));
glEnableVertexAttribArray(1);
//设置纹理位置属性,并启用
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void*)(6*sizeof(float)));
glEnableVertexAttribArray(2);
/*************************************************************************************************************/
//创建纹理
GLuint texture;
glGenTextures(1, &texture);
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_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
int width, height, nrchannels;
const char* path = "C:\\Users\\fusheng\\Desktop\\opengl\\texture\\pear.png";
stbi_set_flip_vertically_on_load(true);
unsigned char* datas = stbi_load(path, &width, &height, &nrchannels, 0);
if(datas)
{
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, datas);
glGenerateMipmap(GL_TEXTURE_2D);
printf("yes\n");
}
else
{
printf("failed to load png %s\n", stbi_failure_reason());
}
stbi_image_free(datas);
/*************************************************************************************************************/
glUseProgram(shaderProgram);
GLuint uniformLocation = glGetUniformLocation(shaderProgram, "ourTexture");
glUniform1i(uniformLocation, 0);
while(!glfwWindowShouldClose(window))
{
glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glfwSwapBuffers(window);
glfwPollEvents();
}
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
glDeleteBuffers(1, &EBO);
glDeleteProgram(shaderProgram);
glfwTerminate();
return 0;
}
最新发布