"https://open.gl/"教程之Transforms源码(freeglut版)
2016-05-06 11:19
435 查看
以上一节Textures代码为基础,没变的部分用灰色表示。
VERTEX_SHADER:
FRAGEMENT_SHADER:
源码:
VERTEX_SHADER:
#version 150 core in 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 core in 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<Windows.h> #include"freeglut.h" #include<gl\GL.h> #include<random> #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]; //translate GLuint 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; }
相关文章推荐
- 你应该知道的HTTP基础知识
- IE浏览器只能打开http协议的网站,所有https协议的网站都打不开,而且会重定向到其他页面
- swift使用swifthttp
- iOS网络开发基础--发送HTTP请求
- 一站式学习Wireshark(四):网络性能排查之TCP重传与重复ACK
- tamcat+https加密请求经验介绍
- uip协议栈TCP Client模式,以太网模块控制灯
- IP数据包个人理解
- 王高利:Apache Httpd负载均衡Tomcat并实现Session Sticky和Session Cluster
- 从一个网页到一个app--一个HttpUrlConnect工具类模板(二_2)
- 客户端大量TIME_OUT tcp连接解决方法
- how browser supports https
- 跨域访问-需要设置HTTP响应标头
- HTTP 错误 500.22 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置。
- 4月第4周网络安全报告:放马站点域名61.3%境内注册
- 苹果公司下魔怔的6月,watch OS 和 IPv6的更新说明。
- Linux网络属性配置命令和管理详解
- HTTP协议简介
- Apache Derby 网络服务器 - 10.9.1.0 - (1344872) 已启动并准备接受端口 1527 上的连接
- tcp/ip详解-ip头部选项字段