OpenGL 纹理学习总结
原图片:
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.0f
到2.0f
范围内的(而不是原来的0.0f
到1.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 纹理学习总结相关推荐
- OpenGl 之学习笔记 glTexCoord2f() 函数以及纹理相关知识总结
2. glTexCoord2f() 函数 原型:glTexCoord2f(GLfloat s,GLfloat t): s代表x坐标,t代表y坐标: s∈[0.0,1.0],t∈[0.0,1.0]: 一 ...
- openGL 纹理使用
最近找了点资料学习了下openGL 纹理的使用 先有个 整体把握, 然后再去看大部头中的细节讲解, 感觉这样的学习方式好些 总结下纹理使用总体流程: 1 启用纹理 glEnable(GL_TEXTUR ...
- OpenGL(十四)——Qt OpenGL纹理
OpenGL(十四)--Qt OpenGL纹理 一.纹理 终于写到纹理的部分了: 纹理(Texture)的本质是一个2D图片(1D和3D),或者叫图形数据.只是在OpenGL中专业术语中称其为纹理. ...
- 最全面的openGL 入门学习
自己在找openGL学习资料的时候,找到此篇openGL入门学习(虽然不是移动开发,但给我提供了非常好的思路),所以转一下让更多人知道,本文来自http://www.cppblog.com/doing ...
- Android OpenGL ES 学习(十一) –渲染YUV视频以及视频抖音特效
OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...
- OpenGL入门学习 (转)
OpenGL入门学习 (转) 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜 ...
- OpenGL入门学习[三]
OpenGL入门学习[三] http://xiaxveliang.blog.163.com/blog/static/2970803420126246501930/ OpenGL入门学习[十一] 我们在 ...
- 【待完善】OpenGL入门学习
严正声明:本文转载自网络,但具体出处未知.如果有读者了解,请联系我更正. 为了阅读方便,我对文字格式进行了修改,并填补了缺少的图片. 我尊重每位作者的权益,如果本文存在侵权行为,请联系我删除并道歉. ...
- 【转载】OpenGL入门学习
说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色 ...
最新文章
- (0066)iOS开发之UITableViewCell上子控件通过superView找对应的cell的探究
- 有道精品课python-115批量转存与提取sha1工具2020下载
- 如何在dreamwaver中连接数据库
- 机器学习实战-数据探索(变量变换、生成)
- DCMTK:dicom标签的基础类
- 深度学总结:Image Style Transfer pytorch方式实现,这个是非基于autoencoder和domain adversrial方式
- linux下vi修改文件用法
- java中showconfirmdialog_Java实现超市管理系统(含数据库)
- bada 2D游戏编程之一——图形绘制
- Java讲课笔记24:字节流
- 可能是国内最火的开源项目 —— C/C++ 篇
- tp5 查询求和_tp5 sum某个字段相加得到总数的例子
- JavaSE基础篇之-Java 流(Stream)、文件(File)和IO
- CPU缓存侧信道攻击综述-Survey of CPU Cache-Based Side-Channel Attacks
- linux在线汇编编译器,Linux 汇编 Hello World
- 红米K40刷机导致基带丢失 基带未知 不读卡 没有串号 修复记录
- R语言如何绘制PCoA主坐标分析(30)
- java编程将HTML文件转换成PDF文件
- 8个超好用的免费工具/软件/网站
- ogre3D学习基础4 -- 网格工具与硬件缓存
热门文章
- 5 个大厂 offer,该怎么选?
- 又是逆袭!大四在校生 6 个月拿下京东美团滴滴等 Offer
- 谷歌软件工程师薪资百万,大厂薪资有多高?
- 大众点评开源监控CAT概览
- 如何使用Nexus搭建Maven私服
- 使用c#訪问Access数据库时,提示找不到可安装的 ISAM
- 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
- okhttp请求文件异常解决方法
- Oracle NoLogging Append 方式减少批量insert的redo_size
- #1045 - Access denied for user 'root'@'localhost' (using password: NO)