原图片:

1.左右镜像变换

这里总结下左右颠倒的方法:

就是更改片段着色器

FragColor = mix(texture(texture1,TexCoord), texture(texture2,vec2(1.0 - TexCoord.x, TexCoord.y)),0.78f);

这段代码的意思就是更改图片的纹理坐标

比如:

(0,0) -> (1,0)

(1,0) -> (0,0)

(0,1) -> (1,1)

(1,1) -> (0,1)

2.

  • 尝试用不同的纹理环绕方式,设定一个从0.0f2.0f范围内的(而不是原来的0.0f1.0f)纹理坐标。试试看能不能在箱子的角落放置4个笑脸:参考解答,结果。记得一定要试试其它的环绕方式。

把笑脸的环绕方式改为 GL_MIRRORED_REPEAT

然后纹理坐标更改:

变为

(这时候超出的边界会自动填充重复的图象)

3.只显示一部分图象,然后用线性放大

 4.使用方向键更改图象透明度

额外设置一个uniform maxValue就可以了

键盘输入

镜像翻转示范代码(库请自己看教程寻找):

OpenGLDemo.cpp

// OpenGLDemo.cpp: 定义控制台应用程序的入口点。#include "stdafx.h"
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <string>
#include <cstring>
#include "Shader.h"
#include <stb_image/stb_image.h>
#include<filesystem>using namespace std;void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow* window);
char* readTheFile(string strSource);int main()
{//glfw: 初始化glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3);glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);//glfw: 窗口创建GLFWwindow* window = glfwCreateWindow(800, 600, "Oh!I see you!", NULL, NULL);if (window == NULL) {std::cout << "Failed to create the windows" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);glfwSwapInterval(1);//glad: 加载OpenGL 函数指针if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {std::cout << "Failed to initialize GLAD" << std::endl;return -1;}Shader shader("vertexShaderSource.vert", "fragmentShaderSource.frag");float vertices[] = {//第一个三角形//  ----位置----   ----颜色----     --纹理坐标--.5f,.5f,0.0f, 1.0f,0.0f,0.0f,  0.0f,1.0f,       //左上   -.5f,-.5f,.0f, 0.0f,1.0f,0.0f,  0.0f,0.0f,       //左下.5f,-.5f,.0f, 0.0f,0.0f,1.0f,  1.0f,0.0f,       //右下.5f, .5f,.0f, 0.0f,0.0f,1.0f,  1.0f,1.0f        //右上};unsigned int indices[] = {0,1,2,0,3,2};unsigned int VBO, VAO, EBO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glGenBuffers(1, &EBO);//绑定顶点数组glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, 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);//texture 1//---------unsigned int texture1,texture2;glGenTextures(1, &texture1);glBindTexture(GL_TEXTURE_2D, texture1);为当前绑定的纹理对象设置环绕、过滤方式glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);float borderColor[] = { 1.0f,1.0f,0.0f,1.0f };glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//加载纹理图片int width, height, nrChannels;unsigned char *data = stbi_load("container.jpg", &width, &height, &nrChannels, 0);if (data) {//生成纹理图片glTexImage2D(GL_TEXTURE_2D,0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);glGenerateMipmap(GL_TEXTURE_2D);       }else {std::cout << "Failed to load texture" << std::endl;}//释放内存stbi_image_free(data);//texture 2//---------glGenTextures(1, &texture2);glBindTexture(GL_TEXTURE_2D, texture2);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);stbi_set_flip_vertically_on_load(true);data = stbi_load("LJW.png", &width, &height, &nrChannels, 0);if (data){glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);glGenerateMipmap(GL_TEXTURE_2D);}else{std::cout << "Failed to load texture" << std::endl;}stbi_image_free(data);shader.use();shader.setInt("texture1", 0);shader.setInt("texture2", 1);while (!glfwWindowShouldClose(window)) {//输入处理processInput(window);//渲染指令glClearColor(0.2f,0.3f,0.3f,1.0f);glClear(GL_COLOR_BUFFER_BIT);glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, texture1);glActiveTexture(GL_TEXTURE1);glBindTexture(GL_TEXTURE_2D, texture2);shader.use();glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES,0,3);glfwSwapBuffers(window);glfwPollEvents();}glfwTerminate();return 0;
}void framebuffer_size_callback(GLFWwindow* windows, int width, int height) {glViewport(0, 0, width, height);
}void processInput(GLFWwindow* window) {if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {glfwSetWindowShouldClose(window, true);}
}//.frag .vert文件读取
char* readTheFile(string strSource) {//fstream 中判断是否成功打开文件//https://blog.csdn.net/fruitz/article/details/41624921std::ifstream myfile(strSource);//打开失败if (myfile.fail()) {std::cout << "Can not open it " << std::endl;throw new runtime_error("IO stream corrupted");}//转换成字符串std::string str((std::istreambuf_iterator<char>(myfile)),std::istreambuf_iterator<char>());//关闭文件处理器myfile.close();//str数组长度一定要 +1,/*原因: https://blog.csdn.net/ShiQW5696/article/details/80676290 */int len = str.length();char* result = new char[len];strcpy_s(result, len + 1, str.c_str());return result;
}

  

fragmentShaderSource.frag

#version 330 core
out vec4 FragColor;in vec2 TexCoord;
in vec3 outColor;uniform sampler2D texture1;
uniform sampler2D texture2;void main()
{FragColor = mix(texture(texture1,TexCoord), texture(texture2,vec2(1.0 - TexCoord.x, TexCoord.y)),0.78f);
}

vertexShaderSource.vert

#version 330 core
layout(location = 0) in vec3 aPos;
layout(location = 1) in vec3 aColor;
layout(location = 2) in vec2 aTexCoord;out vec3 outColor;
out vec2 TexCoord;void main()
{gl_Position = vec4(aPos, 1.0);outColor = aColor;TexCoord = aTexCoord;
}

  

转载于:https://www.cnblogs.com/--zz/p/9716069.html

OpenGL 纹理学习总结相关推荐

  1. OpenGl 之学习笔记 glTexCoord2f() 函数以及纹理相关知识总结

    2. glTexCoord2f() 函数 原型:glTexCoord2f(GLfloat s,GLfloat t): s代表x坐标,t代表y坐标: s∈[0.0,1.0],t∈[0.0,1.0]: 一 ...

  2. openGL 纹理使用

    最近找了点资料学习了下openGL 纹理的使用 先有个 整体把握, 然后再去看大部头中的细节讲解, 感觉这样的学习方式好些 总结下纹理使用总体流程: 1 启用纹理 glEnable(GL_TEXTUR ...

  3. OpenGL(十四)——Qt OpenGL纹理

    OpenGL(十四)--Qt OpenGL纹理 一.纹理 终于写到纹理的部分了: 纹理(Texture)的本质是一个2D图片(1D和3D),或者叫图形数据.只是在OpenGL中专业术语中称其为纹理. ...

  4. 最全面的openGL 入门学习

    自己在找openGL学习资料的时候,找到此篇openGL入门学习(虽然不是移动开发,但给我提供了非常好的思路),所以转一下让更多人知道,本文来自http://www.cppblog.com/doing ...

  5. Android OpenGL ES 学习(十一) –渲染YUV视频以及视频抖音特效

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  6. OpenGL入门学习 (转)

    OpenGL入门学习 (转) 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜 ...

  7. OpenGL入门学习[三]

    OpenGL入门学习[三] http://xiaxveliang.blog.163.com/blog/static/2970803420126246501930/ OpenGL入门学习[十一] 我们在 ...

  8. 【待完善】OpenGL入门学习

    严正声明:本文转载自网络,但具体出处未知.如果有读者了解,请联系我更正. 为了阅读方便,我对文字格式进行了修改,并填补了缺少的图片. 我尊重每位作者的权益,如果本文存在侵权行为,请联系我删除并道歉. ...

  9. 【转载】OpenGL入门学习

    说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色 ...

最新文章

  1. (0066)iOS开发之UITableViewCell上子控件通过superView找对应的cell的探究
  2. 有道精品课python-115批量转存与提取sha1工具2020下载
  3. 如何在dreamwaver中连接数据库
  4. 机器学习实战-数据探索(变量变换、生成)
  5. DCMTK:dicom标签的基础类
  6. 深度学总结:Image Style Transfer pytorch方式实现,这个是非基于autoencoder和domain adversrial方式
  7. linux下vi修改文件用法
  8. java中showconfirmdialog_Java实现超市管理系统(含数据库)
  9. bada 2D游戏编程之一——图形绘制
  10. Java讲课笔记24:字节流
  11. 可能是国内最火的开源项目 —— C/C++ 篇
  12. tp5 查询求和_tp5 sum某个字段相加得到总数的例子
  13. JavaSE基础篇之-Java 流(Stream)、文件(File)和IO
  14. CPU缓存侧信道攻击综述-Survey of CPU Cache-Based Side-Channel Attacks
  15. linux在线汇编编译器,Linux 汇编 Hello World
  16. 红米K40刷机导致基带丢失 基带未知 不读卡 没有串号 修复记录
  17. R语言如何绘制PCoA主坐标分析(30)
  18. java编程将HTML文件转换成PDF文件
  19. 8个超好用的免费工具/软件/网站
  20. ogre3D学习基础4 -- 网格工具与硬件缓存

热门文章

  1. 5 个大厂 offer,该怎么选?
  2. 又是逆袭!大四在校生 6 个月拿下京东美团滴滴等 Offer
  3. 谷歌软件工程师薪资百万,大厂薪资有多高?
  4. 大众点评开源监控CAT概览
  5. 如何使用Nexus搭建Maven私服
  6. 使用c#訪问Access数据库时,提示找不到可安装的 ISAM
  7. 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  8. okhttp请求文件异常解决方法
  9. Oracle NoLogging Append 方式减少批量insert的redo_size
  10. #1045 - Access denied for user 'root'@'localhost' (using password: NO)