#include "glew.h"
#include "glfw3.h"
#include "SOIL2.h"//如何解析輸入的數據流 0,1,2 分三部分
GLchar * vertextSrc = " #version 330 core \n \layout (location = 0) in vec3 position; \layout (location = 1) in vec3 color; \layout (location = 2) in vec2 texcoord;\out vec3 outcolor; \out vec2 outtexcoord; \void main(){gl_Position = vec4(position, 1.0f);outcolor = color;outtexcoord = texcoord;}";// texture 是紋理接口 返回紋理顏色, texture(參數1=采樣器, 參數2=紋理坐標)
// sampler2D 紋理采樣器
GLchar * fragmentSrc = "#version 330 core \n \in vec3 outcolor;\in vec2 outtexcoord;\out vec4 color; \uniform sampler2D ourTexture;\void main(){ \color = texture(ourTexture, outtexcoord) *vec4(outcolor,1.0f) ; \}";
//int main()
{glfwInit();GLFWwindow* window = glfwCreateWindow(500,600,"Texture", NULL,NULL);glfwMakeContextCurrent(window);glewInit();GLfloat arrays[] = {0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.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, 0.0f, 0.0f,-0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f};GLuint earrays[] = {0,1,3,1,2,3};//創建數組緩沖對象GLuint VAO, VBO, EBO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glGenBuffers(1, &EBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER,VBO);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);//GPU 開辟開辟緩存存放數據glBufferData(GL_ARRAY_BUFFER, sizeof(arrays), arrays, GL_STATIC_DRAW);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(earrays), earrays, GL_STATIC_DRAW);//如何解析數據到頂點著色器, 8 個數據作為一個步長glVertexAttribPointer(0, 3,GL_FLOAT,false, 8* sizeof(GLfloat),(GLvoid*)0); //第一個輸入變量的解析規則 layout(location=0)glVertexAttribPointer(1, 3, GL_FLOAT, false, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); // layout(location = 1)glVertexAttribPointer(2, 2, GL_FLOAT, false, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat))); // ...glEnableVertexAttribArray(0);glEnableVertexAttribArray(1);glEnableVertexAttribArray(2);//glDeleteBuffers(VBO);//glDeleteBuffers(EBO);glBindVertexArray(0);//創建著色器程序GLuint Vertexshader, fragmentShader, programShader;Vertexshader = glCreateShader(GL_VERTEX_SHADER);fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);programShader = glCreateProgram();GLint succeed;char info[512];glShaderSource(Vertexshader,1,&vertextSrc,(GLint*)0);glCompileShader(Vertexshader);glGetShaderiv(Vertexshader, GL_COMPILE_STATUS, &succeed);if (!succeed){glGetShaderInfoLog(Vertexshader, 512, NULL, info);}glShaderSource(fragmentShader, 1, &fragmentSrc, (GLint*)0);glCompileShader(fragmentShader);glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &succeed);if (!succeed){glGetShaderInfoLog(fragmentShader, 512, NULL, info);}glAttachShader(programShader,Vertexshader);glAttachShader(programShader, fragmentShader);glLinkProgram(programShader);glDeleteShader(Vertexshader);glDeleteShader(fragmentShader);//創建紋理對象GLuint texture;glGenTextures(1, &texture);glBindTexture(GL_TEXTURE_2D, texture);//綁定應用該紋理對象//設置該紋理的紋理環繞方式和紋理過濾方式glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);//x 軸紋理渲染方式,重復渲染glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT); // y軸紋理渲染方式//紋理過濾:紋理像素映射到紋理坐標上的過程中做的紋理像素處理, 定義一個點(點所在的像素顏色區域,返回顏色值的規則)// GL_NEAREST: 鄰近過濾 ,返回所在點的當前固定顏色值,整體看起來顏色分明,像素點一樣// GL_LINEAR: 線性過濾, 返回所在點的(單位面積內的綜合顏色值),整體看起來比較模糊,線性過度染色glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);//縮小過濾方式glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);int width, height;unsigned char* image = SOIL_load_image("E:/container.jpg", &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);while (!glfwWindowShouldClose(window)){glfwPollEvents();glClearColor(1.0f, 0.0f, 1.0f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);glBindTexture(GL_TEXTURE_2D, texture);glUseProgram(programShader);glBindVertexArray(VAO);glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);glBindVertexArray(0);glfwSwapBuffers(window);}glfwTerminate();return 0;
}
注意點
1.檢驗著色器編譯有沒有通過,vec3轉vec4有沒有正確
2.創建EBO(元素緩存對象)時的綁定數據和加載數據的枚舉為 E_ELEMENT_ARRAY_BUFFER
3.使能頂點數組的指定屬性
glEnableVertexAttribArray(0);
使能第一個屬性:位置
glEnableVertexAttribArray(1);
使能第二個屬性:顏色
glEnableVertexAttribArray(2);
使能第三個屬性:紋理坐標