博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
"https://open.gl/"教程之Transforms源码(freeglut版)
阅读量:7059 次
发布时间:2019-06-28

本文共 6181 字,大约阅读时间需要 20 分钟。

以上一节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;}

 

转载于:https://www.cnblogs.com/jiafenggang/p/5464911.html

你可能感兴趣的文章
iOS多用连接、反向协议、安全
查看>>
Swift - 滚动视图(UIScrollView)的用法
查看>>
Altium Designer 出现错误提示(警告)adding items to hidden net GND/VCC
查看>>
poj 3270(置换 循环)
查看>>
RHCE7 管理I-12归档文件并在Linux系统间复制文件
查看>>
第十四回(一):外战折戟再图雪耻 石路徜徉终是难忘
查看>>
Android中Menu的基本用法
查看>>
接口JSon字符串格式
查看>>
[转]java基础学习总结——equals方法
查看>>
SVN相关
查看>>
MapReduce在实际编程“I/O”
查看>>
SecureCRT配色
查看>>
Spring、Spring MVC、MyBatis整合文件配置详解
查看>>
spring-mvc 与 openid4java
查看>>
iBatis简单入门教程
查看>>
将archlinux 2013-06-01版,安装配置为个人工作站
查看>>
十大流行Linux发行版
查看>>
微信公众平台消息接口开发之微信浏览器HTTP_USER_AGENT判断
查看>>
Android自定义ScrollView实现一键置顶功能
查看>>
samba配置
查看>>