OpenGL下多个sampler在shader中的使用
在OpenGL中,sampler2D/Cube等做为uniform可以在fragment shader中使用。结合glActiveTexture和glUniform1i,实现texture与sampler的绑定。
正常情况下的使用,可以参照各种GLSL教程里的例子。这里说一下非正常情况下在shader中使用多个sampler。
比如在fragment shader中声明了多个sampler:
uniform samplerCube environmentMap;
uniform sampler2D baseTexture;
uniform sampler2D bumpTexture;
uniform bool enableEnvronmentMap;
uniform bool useBaseTexture;
uniform bool enableBump;
从声明上可以看出,这里用了三个变量分别控制是否在shader program中使用对应的sampler。比如,把enableBump设置为false,shader中就不用调用bumpTexture这个sampler2D。从而,在程序中就可以少调用glActiveTexture、glBindTexture、glEnable(GL_TEXTURE_2D)等。
等等,真的可以少调用glActiveTexture了吗?
之前,我是这样认为的。经过实践发现,确实是这样的。当然,与sampler对应的uniform必须设置。
另外一个问题,把enableBump设置为false后,sampler uniform的值需要调整吗?
假如baseTextue对应0, bumpTexture对应1,environmentMap对应2,那么如果把enableBump设置为false,不使用bumpTexture,也不为bump设置glActiveTexture,那其他两个unifrom应该设置何值?给bumpTexture设置何值?答案:0,1,2,即bumpTexture与environmentMap换位置了。从而可以得知,如果只使用environmentMap,应该为:environmentMap:0, baseTexture:1, bumpTexture:2,或者base与bump互换。
至此,真相大白。
OpenGL下多个sampler在shader中的使用的更多相关文章
- 【Unity Shaders】Shader中的光照
写在前面 自己写过Vertex & Fragment Shader的童鞋,大概都会对Unity的光照痛恨不已.当然,我相信这是因为我们写得少...不过这也是由于官方文档对这方面介绍很少的缘故, ...
- Shader 中的颜色计算
下面介绍 Shader 中 gl_FragColor 的计算与转换: 一.颜色计算 1. 加 这里要讲讲三原色和三基色:三原色一般指的是红.绿.蓝三种,简称 RGB,这是加色系.就是光源只含有特定的波 ...
- mac下查看.mobileprovision文件及钥匙串中证书.cer文件
mac下查看.mobileprovision文件及钥匙串中证书.cer文件 一. mobileprovision文件查看 xxx.mobileprovision是ios开发中的设备描述文件,里面有证书 ...
- BarTender如何将条码下的数字嵌入到条码中
现今社会,在各种包装箱子.书籍.超市商品等东西上面,必不可少的绝对要数条形码或者二维码了.有时候,根据客户的需求或者其他条件限制等原因,我们需要将BarTender 2016条码下的数字嵌入到条码中. ...
- 【Unity Shaders】Diffuse Shading——在Surface Shader中使用properties
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- [Unity3D]降低向Shader中传值的开销
Unity3D中提供了很多API用于向shader传值,这篇文章对比测试了两类不同的使用方法的性能. 正文 Unity3D中,通过C#代码向shader传值有两种方式. 一种是面向具体的materia ...
- unity, shader中获得当前像素深度
frag shader中直接访问i.pos.z就是深度,不必除以i.pos.w,因为系统已经自动进行过了透视除法且已将i.pos.w置为0.
- Unity关闭shader中的光照模型以及如何自定义光照模型
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject' // Upgrade NOTE: replaced '_Wor ...
- unity, multi pass shader中的surface pass
今天尝试写一个multi pass shader,但其中有一个Pass是surface pass,总是莫名奇妙地报错.后来看到下面帖子: http://forum.unity3d.com/thread ...
随机推荐
- android 网络连接 HttpGet HttpPost方法
1.本文主要介绍利用HttpGet和HtppPost方法来获取网络json数据. 代码如下: public HttpData(String Url,HttpGetDataListener listen ...
- windows系统下安装和使用ROS的解决方案 (1 win_ros 2 rosserial_windows)
具体请参考官网: 1 http://wiki.ros.org/win_ros 2 https://github.com/ros-windows/win_ros 3 http://wiki.ros ...
- SQL Server 索引维护(1)——如何获取索引使用情况
前言: 在前面一文中,已经提到了三类常见的索引问题,那么问题来了,当系统出现这些问题时,该如何应对? 简单而言,需要分析现有系统的行为,然后针对性地对索引进行处理: 对于索引不足的情况:检查缺少索引的 ...
- 22 Notification 通知栏代码
结构图: MainActivity.java package com.qf.day22_notification; import android.app.Activity; import androi ...
- Android中PropertyAnimation属性动画详解(一)
在之前的文章中已经讲了帧动画frame-by-frame animation和补间动画tweened animation,其实这两种动画原理好简单,都是按照预先固定的动画模式来播放的,帧动画将一张张单 ...
- 3.2、Android Studio在物理设备中运行APP
当你构建一个Android应用时,在发布给用户之前,在物理设备上测试一下你的应用是非常必要的. 你可以使用Android设备作为运行.调试和测试应用的环境.包含在SDK中的工具让你在编译完成后在设备中 ...
- linu下C语言之BMP图片操作编程(下)
前面提高了一个将BMP左转的程序,右转其实也是类似的操作,就不写了,这节,我们来实现,将一张BMP图进行灰度处理,代码贴上: #include <stdio.h> #include < ...
- Java并发框架——AQS阻塞队列管理(一)——自旋锁
我们知道一个线程在尝试获取锁失败后将被阻塞并加入等待队列中,它是一个怎样的队列?又是如何管理此队列?这节聊聊CHL Node FIFO队列. 在谈到CHL Node FIFO队列之前,我们先分析这种队 ...
- Quick-Cocos2d-X 捋一捋框架流程
猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=535 一直比较关注Quick L ...
- Android初级教程实现电话录音
需求:设置来电后自动录音. 首先设置一个按钮,代码很简单这里就不再给出. 建一个类,RecorderServicer extends Service package com.ydl.recorder; ...