学习使用Shader处理纹理

2023-11-16

使用Shader处理纹理本是件简单的事情,但是我在尝试写一个简单的例子的时候却犯了个错误,导致郁闷了一天,这个稍后再说。 先整理下怎么用Shader处理纹理吧。

1.原理:

用Shader处理纹理的原理其实很简单,将纹理通过一个uniform变量传入shader,然后对着个uniform变量进行操作,就可以直接操作纹理了。

2.参考资料

lighthouse3d上面的教程比较简略,没有列出完整的程序,我看后比较迷茫。http://www.lighthouse3d.com/tutorials/glsl-tutorial/simple-texture/ 写得比较详细的是这么一本书:OpenGL® Shading Language, Second Edition,Chapter10.2有比较详细的介绍。电子版地址:http://wiki.labomedia.org/images/1/10/Orange_Book_-_OpenGL_Shading_Language_2nd_Edition.pdf 总结下大体思路就是:生成纹理——绑定纹理——设置纹理——激活纹理——传递变量给shader

3.题外话

下面该说说我犯的这个错误了。重点在于我傻乎乎的以为纹理坐标已经不需要设置了(display函数中),Shader会智能地处理这些。仔细想想其实这种想法很不合理,因为Shader并不知道纹理坐标和顶点坐标的对应关系,比如 某个顶点应该对应纹理的左上还是左下坐标。所以当我在display函数中加上纹理坐标的设置之后一切都变得正常了。 这个故事告诉我们:写程序的时候想当然是最可怕的。。

4.代码
最后贴上代码吧,供以后查阅。
vertex shader代码:
1
2
3
4
5
void  main()
{
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}
fragment shader代码:
1
2
3
4
5
6
uniform sampler2D sampler0;
void  main()
{
vec3 lightColor = vec3(texture2D(sampler0, gl_TexCoord[0].st));
gl_FragColor = vec4(1-lightColor, 0.0); //反色
}
纹理设置代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
glClearColor (0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
makeImage();
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &texName);
glBindTexture(GL_TEXTURE_2D, texName);
/* 定义纹理 */
glTexImage2D(GL_TEXTURE_2D, 0, 3, ImageWidth,
ImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, &Image[0][0][0]);
/* 控制滤波 */
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
/* 说明映射方式*/
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
/* 启动纹理映射 */
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_FLAT);
向shader中传递变量:
1
2
GLuint texLoc = glGetUniformLocation(p, "sampler0" );
glUniform1i(texLoc,0);
显示代码:
1
2
3
4
5
6
7
8
9
10
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0);
glVertex3f(-1.0, -1.0,0.0);
glTexCoord2f(0.0, 1.0);
glVertex3f(1.0, -1.0,0.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(1.0, 1.0,0.0);
glTexCoord2f(1.0, 0.0);
glVertex3f(-1.0, 1.0,0.0);
glEnd();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习使用Shader处理纹理 的相关文章

  • OpenGL NURBS 曲面

    我正在学习 OpenGL 我想要一个中间有轻微驼峰的表面 我目前正在使用这段代码 但我不确定如何调整 ctrl 点以使其达到我想要的方式 它目前就像 我想要这样的 我不完全确定我应该使用哪些控制点 并且我对其工作原理感到困惑 include
  • 将glm四元数转换为旋转矩阵并与opengl一起使用

    所以我将对象的方向存储在 glm fquat 中 我想用它来旋转我的模型 我怎么做 我试过这个 glPushMatrix glTranslatef position x position y position z glMultMatrixf
  • OpenGL Z 偏置(多边形偏移)限制

    我有两个共面的多边形 我尝试做 glEnable GL POLYGON OFFSET FILL glPolygonOffset 0 1 并期望其中一个明显 位于 另一个之上 这种情况直到大约 70 75 个单位之外 近剪裁平面为 1 远剪裁
  • 如何将 3D 图像输出到 3D 电视?

    我有一台 3D 电视 如果我不至少尝试让它显示我自己创作的漂亮 3D 图像 我就会逃避我的责任 作为一个极客 我之前已经完成了非常基本的 OpenGL 编程 因此我了解所涉及的概念 假设我可以为自己渲染一个简单的四面体或立方体并使其旋转一点
  • glutPostRedisplay 不在循环内工作

    我试图让一个人在 y 轴上跳跃 所以我使用 2 秒的循环 第一秒它应该向下移动并弯曲膝盖 第二秒它应该向上移动 然后在起始位置完成 现在我刚刚开始让这个人在第一秒内跪下并弯曲膝盖 我还没有编写动画的其余部分 问题是 glutPostRedi
  • OpenGL 和加载/读取 AoSoA(混合 SoA)格式的数据

    假设我有以下 AoSoA 格式的简化结构来表示顶点或点 struct VertexData float px 4 position x float py 4 position y 也就是说 每个实例VertexData存储4个顶点 我见过的
  • 为什么我的 FPS 相机一劳永逸地滚动?

    如果我忽略四元数代数的肮脏细节 我想我理解了旋转和平移变换背后的数学 但仍然不明白我做错了什么 为什么我的相机一劳永逸地滚动 更具体地说 我应该如何从相机的方向 旋转矩阵 计算相机视图矩阵 我正在用 Python 编写一个简约的 3d 引擎
  • 如何将点光源转换为卵形/椭圆形?

    我希望通过具有不同 x 和 y 值的 vec2 半径将当前的圆形光变成椭圆形 有没有办法根据我当前在片段着色器中的代码来做到这一点 uniform struct Light vec4 colour vec3 position vec2 ra
  • WebKit 是否使用 OpenGL 来渲染 CSS 过渡?

    WebKit 是使用 OpenGL 来渲染 CSS 过渡 还是使用软件渲染 WebKit 只是一个前端 这取决于后端和硬件支持 谷歌浏览器使用skia http code google com p skia 作为后端 它可以使用软件或硬件
  • lnk1104:无法打开“LIBC.lib”链接

    使用 GLee 将着色器写入我的 OpenGL 项目并编译后 我收到了错误LNK1104 cannot open file LIBC lib 我尝试按照其他人的建议添加它并忽略它 但没有解决问题 有没有其他方法可以解决我错过的这个问题 以下
  • Eclipse 标记 OpenGL 函数无法解析

    我尝试在 Eclipse C C 中使用一些 OpenGL 函数 一些 标准 函数如 GlClear 可以被 eclipse 识别 而其他函数如 glBindBuffer 和 glEnableVertexAttribArray 则不能 它们
  • glut 库中缺少 glutInitContextVersion()

    我正在练习一些 opengl 代码 但是当我想通过以下方式强制 opengl 上下文使用特定版本的 opengl 时glutInitContextVersion 它编译过程失败并给出以下消息 使用未声明的标识符 glutInitContex
  • 将四元数旋转转换为旋转矩阵?

    基本上 给定一个四元数 qx qy qz qw 我如何将其转换为OpenGL旋转矩阵 我也对哪个矩阵行是 向上 向右 向前 等感兴趣 我有一个四元数的相机旋转 我需要在向量中 以下代码基于四元数 qw qx qy qz 其中顺序基于 Boo
  • GLSL NVidia 方形神器

    当 GLSL 着色器在以下 GPU 上生成不正确的图像时 我遇到了问题 GT 430 GT 770 GTX 570显卡760 但在这些上正常工作 英特尔高清显卡 2500英特尔高清4000英特尔4400显卡740MRadeon HD 631
  • 在 Linux 上运行我自己的程序的权限被拒绝? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有Ubuntu 9 4 我已经构建了程序 一些基本的 OpenGL 该程序只是制作一个旋转的正方形 然后运行它并 sh blabla p
  • Visual Studio 2010 中的 SOIL 设置

    我无法得到SOIL http www lonesock net soil html正确使用 Visual Studio 2010 我远非 VS 专家 但据我所知 只需执行以下步骤即可使环境正常运行 属性 gt gt C C gt 常规 gt
  • 使用 GLSL 直接在着色器中从位置计算平移矩阵

    我正在开发 C OpengL 程序以及 GLSL 顶点和片段着色器 我正在创建同一对象的多个实例 我只需要改变实例之间的对象位置 这是我所做的 我正在使用一个统一变量 它是一个变换矩阵数组 每个矩阵代表一个对象实例 MVP 也是一个变换矩阵
  • 更改 GLUT 调用以与 MFC/C++ 一起使用

    我有一个使用 GLUT 进行 OpenGL 渲染的程序 现在我需要它位于 MFC 项目内部 以便它可以与另一个程序组件一起使用 我已经按照这个教程进行操作 http www codeguru com cpp g m opengl openf
  • 致命错误 gl.h 包含在 glew.h 之前

    include
  • 使用 pyclutter 进行编程

    我是混乱 和 pyclutter 的新手 我一直在尝试使用 pyclutter 到目前为止我还没有找到任何好的教程 我的意思是没有真正正确解释的内容 我看到了几个示例程序 但是当我尝试使用 pyclutter 时 我没有得到任何好的结果 这

随机推荐

  • android studio对数据库进行,Android Studio 学习(四) 数据库

    文件存储 写数据 String data Data ti save FileOutputStream out null BufferedWriter writer null try out openFileOutput data Conte
  • C++毕业设计基于QT实现的超市收银管理系统源代码+数据库

    C 毕业设计基于QT实现的超市收银管理系统源代码 数据库 编译使用 编译完成后 需要拷贝 file目录下的数据库 POP db文件到可执行程序目录下 登录界面 主界面 会员管理 完整代码下载地址 基于QT实现的超市收银管理系统源代码 数据库
  • ctf.show 通关秘籍

    文章目录 CTF show 1 web签到题 2 web2 3 web3 CTF show 1 web签到题 访问web签到题的地址 发现页面只有 where is flag 字样 使用Fn F12进入调试模式 或者页面空白处点击右键查看网
  • mysql默认的数据库和表_MySQL 自带4个默认数据库

    默认数据库分类 information schema performance schema mysql test informance schema 保存了MySQl服务所有数据库的信息 具体MySQL服务有多少个数据库 各个数据库有哪些表
  • Mrosoft visual c++6.0打开文件未响应,快速解决。【最新办法,初学者都会】

    1 下载filetool的vc6 0的辅助工具 下载地址 http download microsoft com download vc60ent s1 6 0 w9xnt4 en us filetool exe 快速下载filetool
  • 为SQL Server Always On可用性组配置域控制器和Active Directory

    In this series for SQL Server Always On availability groups we are covering end to end configurations for SQL Server 201
  • echarts横向个性化柱状图

    先看一下效果图 横向柱状图 顶部小圈是一个图片 下面我们就来看看如何实现 1 第一步 先把柱状图中需要插入的图片 转换成base64格式 百度搜一下 可以搜到在线工具直接转换 2 html中定义一个div 用来盛放柱状图 div style
  • 《STL源码剖析》(二)——空间配置器

    一 为什么要有空间配置器 1 小块内存带来的内存碎片问题 单从内存分配的角度来讲 由于频繁分配 释放小块内存容易在堆中造成外碎片 极端情况下 堆中空闲的总量满足一个要求 但是这些空闲的块都不连续 导致任何一个单独的空闲的块都无法满足请求 2
  • C练题笔记之:Leetcode-793. 阶乘函数后 K 个零

    题目 f x 是 x 末尾是 0 的数量 回想一下 x 1 2 3 x 且 0 1 例如 f 3 0 因为 3 6 的末尾没有 0 而 f 11 2 因为 11 39916800 末端有 2 个 0 给定 k 找出返回能满足 f x k 的
  • NO-CARRIER

    自己动手写了创建虚拟接口 删除虚拟接口程序 频繁调用创建删除时 有时将接口up起来时会报错 Name not unique on network 利用ip link命令来查看接口 及其对应的索引 可以查看到与其他接口不同的是有个标志为 NO
  • 利用多个panel重叠来代替tabcontrol方法

    这两天 在弄一个C 软件 看着tabcontrol那个讨厌的标签 真是火大 折腾了1个周末加今天1个白天 总是不行 其实我就是想要一排按纽 来控掉不同的界面显示 今天打算使用多个pannel来代替tabcontrol 自己在旁边再弄几个按纽
  • Angular_学习笔记_01

    3天Angular视频课程 之 第1天 学习笔记 1 安装 Node 官网下载 一路Next gt 2 安装Angular cli sudo npm install g angular cli 3 ng new app name 4 运行项
  • scrapy 快速入门

    安装Scrapy Scrapy是一个高级的Python爬虫框架 它不仅包含了爬虫的特性 还可以方便的将爬虫数据保存到csv json等文件中 首先我们安装Scrapy pip install scrapy 在Windows上安装时可能会出现
  • 【实用】Mysql 按照时间(年月周日)维度统计,不存在时间数据 自动补充 0 数值

    前言 ps 网上看了一大堆文章 介绍的东西真的是很够呛 就没一个能真正用起来的 各个都是自动补 然后很多都是不好用的 我自己整理一篇 这是真能用 本篇内容 按照 日 周 月 年 的维度 去对数据 做分组统计 不存在的数据自动补充 0 实用
  • 村长告诉你:Python实现性能自动化测试竟然如此简单

    一 思考 1 什么是性能自动化测试 性能 系统负载能力 超负荷运行下的稳定性 系统瓶颈 自动化测试 使用程序代替手工 提升测试效率 性能自动化 使用代码模拟大批量用户 让用户并发请求 多页面多用户并发请求 采集参数 统计系统负载能力 生成报
  • 记一次QuartzScheduler启动后无法正常执行定时任务的问题

    最近想研究一下爬虫 由于爬虫工具服务端采用的是docker镜像的方式 为了让docker环境和系统环境分开 PS 纯粹不想在windows机让安装太多这些有一定的系统侵入的程序 所以就准备下载一个VMware 搞个虚拟机 然后在虚拟机上装个
  • [计算机毕业设计]元学习方法的小样本图像分类算法

    前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度的 对本科同学来说是充满挑战 为帮助大
  • Vue8基础:事件处理

    1 事件处理 1 绑定监听 v on xxx fun xxx fun xxx fun 参数 默认事件形参 event 隐含属性对象 event 2 事件修饰符 prevent 阻止事件的默认行为 event preventDefault s
  • LLE原理及推导过程

    1 概述 所谓LLE 局部线性嵌入 即 Locally Linear Embedding 的降维算法 在处理所谓流形降维的时候 效果比PCA要好很多 首先 所谓流形 我们脑海里最直观的印象就是Swiss roll 在吃它的时候喜欢把它整个摊
  • 学习使用Shader处理纹理

    使用Shader处理纹理本是件简单的事情 但是我在尝试写一个简单的例子的时候却犯了个错误 导致郁闷了一天 这个稍后再说 先整理下怎么用Shader处理纹理吧 1 原理 用Shader处理纹理的原理其实很简单 将纹理通过一个uniform变量