以上一节Textures代码为基础,没变的部分用灰色表示。
VERTEX_SHADER:
#version 150 corein vec2 position;in vec3 color;in vec2 texcoord;out vec3 Color;out vec2 TexCoord;uniform mat4 trans;uniform mat4 view;uniform mat4 project;void main(){ Color=color; TexCoord=texcoord; //gl_Position=trans*vec4(position,0,1); //只设置view,没设置project什么都看不大 //gl_Position=view*trans*vec4(position,0,1); gl_Position=project*view*trans*vec4(position,0,1);}
FRAGEMENT_SHADER:
#version 150 corein vec3 Color;in vec2 TexCoord;out vec4 outColor;uniform sampler2D texKit;uniform sampler2D texPupy;uniform vec3 triangleColor;void main(){ //outColor=texture(texKit,TexCoord)*vec4(Color,1.0); vec4 colKit=texture(texKit,TexCoord); vec4 colPupy=texture(texPupy,TexCoord); outColor=mix(colKit,colPupy,0.2);}
源码:
#include"glew.h"#include#include"freeglut.h"#include #include #include"LoadShaders.h"#include"SOIL.h"#include"glm\glm.hpp"#include"glm\gtc\matrix_transform.hpp"#include"glm\gtc\type_ptr.hpp"GLuint vao;GLuint vbo;GLuint ebo;GLuint tbo[2];//translateGLuint uniTransLoc;glm::mat4 trans; //初始化一个单位矩阵void Init(){ GLfloat vertices[] = { -0.5, 0.5, 1.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.0, 1.0, 0.0, 1.0, 0.0, 0.5, -0.5, 0.0, 0.0, 1.0, 1.0, 1.0, -0.5, -0.5, 1.0, 1.0, 1.0, 0.0, 1.0 }; GLuint elements[] = { 0, 1, 2, 2, 3, 0 }; ShaderInfo shaders[] = { { GL_VERTEX_SHADER, "vertexShader.txt" }, { GL_FRAGMENT_SHADER, "fragementShader.txt" }, { GL_NONE, NULL } }; GLuint shaderProgram = LoadShaders(shaders); //**VAO开始记录 glGenVertexArrays(1, &vao); glBindVertexArray(vao); //*VBO,需要数据配接 glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); //*数据配接 glUseProgram(shaderProgram); GLuint posAttri = glGetAttribLocation(shaderProgram, "position"); glVertexAttribPointer(posAttri, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), 0); glEnableVertexAttribArray(posAttri); GLuint colorAttri = glGetAttribLocation(shaderProgram, "color"); glVertexAttribPointer(colorAttri, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (void*)(2 * sizeof(GL_FLOAT))); glEnableVertexAttribArray(colorAttri); GLuint texAttri = glGetAttribLocation(shaderProgram, "texcoord"); glVertexAttribPointer(texAttri, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (void*)(5 * sizeof(GL_FLOAT))); glEnableVertexAttribArray(texAttri); //*EBO glGenBuffers(1, &ebo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW); //*TBO glGenTextures(2, tbo); int width = 0, height = 0; unsigned char* image; glActiveTexture(GL_TEXTURE0); //对应samplerD texKit glBindTexture(GL_TEXTURE_2D, tbo[0]); image = SOIL_load_image("sample.png", &width, &height, 0, SOIL_LOAD_RGB); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); SOIL_free_image_data(image); glUniform1i(glGetUniformLocation(shaderProgram, "texKit"), 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glActiveTexture(GL_TEXTURE1); //对应samplerD texPupy glBindTexture(GL_TEXTURE_2D, tbo[1]); image = SOIL_load_image("sample2.png", &width, &height, 0, SOIL_LOAD_RGB); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); SOIL_free_image_data(image); glUniform1i(glGetUniformLocation(shaderProgram, "texPupy"), 1); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //**translation //trans = glm::rotate(trans, glm::radians(5.f), glm::vec3(0.0f, 0.f, 1.f)); uniTransLoc = glGetUniformLocation(shaderProgram, "trans"); glUniformMatrix4fv(uniTransLoc, 1, GL_FALSE, glm::value_ptr(trans)); //*view 默认eye(0.f,0.f,0.f),center(0.f,0.f,-1.f),up(0.f,1.f,0.f) glm::mat4 view=glm::lookAt(glm::vec3(1.2f, 1.2f, 1.2f), glm::vec3(0.f, 0.f, 0.f), glm::vec3(0.f, 0.f, 1.f)); GLuint uniViewLoc = glGetUniformLocation(shaderProgram, "view"); glUniformMatrix4fv(uniViewLoc, 1, GL_FALSE, glm::value_ptr(view)); //*project 3D中一定要设置投影,否则看不到 glm::mat4 project = glm::perspective(glm::radians(45.f), 1.f, 1.f, 100.f); GLuint uniProjectLoc = glGetUniformLocation(shaderProgram, "project"); glUniformMatrix4fv(uniProjectLoc, 1, GL_FALSE, glm::value_ptr(project)); glClearColor(0, 0, 0, 1);}void Display(){ glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(vao); //glDrawArrays(GL_TRIANGLES, 0, 3); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); //glDrawElementsBaseVertex(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0, 1); glFlush();}void KeyboardFunc(unsigned char c, int x, int){ switch (c) { case 'x': case 'X': trans = glm::rotate(trans, glm::radians(5.f), glm::vec3(1.f, 0.f, 0.f)); case 'y': case 'Y': trans = glm::rotate(trans, glm::radians(5.f), glm::vec3(0.f, 1.f, 0.f)); case 'z': case 'Z': trans = glm::rotate(trans, glm::radians(5.f), glm::vec3(0.f, 0.f, 1.f)); default: break; } glUniformMatrix4fv(uniTransLoc, 1, GL_FALSE, glm::value_ptr(trans)); glutPostRedisplay();}int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutInitWindowSize(512, 512); glutInitWindowPosition(100, 200); glutInitContextVersion(3, 2); glutInitContextProfile(GLUT_CORE_PROFILE); glutCreateWindow(argv[0]); glewExperimental = true; glewInit(); Init(); glutDisplayFunc(Display); glutKeyboardFunc(KeyboardFunc); glutMainLoop(); return 0;}