http://blog.csdn.net/huawenguang/article/details/41245871

如何向GLSL中传入多个纹理

这几天在研究如何实现用GLSL对多个纹理进行融合处理,发现除了第一个纹理之外其它的纹理参数都无法传递到GLSL中去,在网上找了很久终于是发现了问题所在,记录一下供大家参考。

如下程序,我们在GLSL的fragment着色程序中定义了3个sample2D作为纹理参数。

  1. uniform sampler2D BaseMap;
  2. uniform sampler2D ReflectMap;
  3. uniform sampler2D RefractMap;

在主程序中,我们生成3个纹理ID

    1. glBindTexture(GL_TEXTURE_2D, BaseID);
    2. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, BaseData);
    3. glBindTexture(GL_TEXTURE_2D, ReflectionID);
    4. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, ReflectionData);
    5. glBindTexture(GL_TEXTURE_2D, RefractionID);
    6. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, RefractionData);
    7. glUseProgram(ShaderID);
    8. // 设定纹理参数的数值,这里是关键,很多时候我们会以为要把纹理ID作为sampler2D参数的值传给GLSL,
    9. // 我们可能会这样写glUniform1i(texLoc, BaseID,但这做法是错的,GLSL的sample2D 只接受纹理单元的索引号,GL_TEXTURE0+i
    10. // 还有一个要注意的地方就是要用glUniform1i函数,而不要用glUniform1ui();
    11. GLint texLoc;
    12. texLoc = glGetUniformLocation(ShaderID, "BaseMap");
    13. glUniform1i(texLoc, 0); //GL_TEXTURE0,
    14. //这里我觉得是opengl做得最不人性化的地方,你只能输入0,1,2来代表纹理单元的索引,不直观,让人摸不着头脑。
    15. texLoc = glGetUniformLocation(ShaderID, "ReflectMap");
    16. glUniform1i(texLoc, 1); //GL_TEXTURE1
    17. texLoc = glGetUniformLocation(ShaderID, "RefractMap");
    18. glUniform1i(texLoc, 2); //GL_TEXTURE2
    19. Then in further down in my draw() function:
    20. // 把纹理ID和纹理单元绑定在一起。
    21. glActiveTexture(GL_TEXTURE0);
    22. glBindTexture(GL_TEXTURE_2D, BaseID);
    23. glActiveTexture(GL_TEXTURE1);
    24. glBindTexture(GL_TEXTURE_2D, ReflectionID);
    25. glActiveTexture(GL_TEXTURE2);
    26. glBindTexture(GL_TEXTURE_2D, RefractionID);
    27. // 用了GLSL,glEnable(GL_TEXTURE_2D);glDisable(GL_TEXTURE_2D);就不起作用了,一切由着色代码来控制。

如何向GLSL中传入多个纹理的更多相关文章

  1. react 不能往组件中传入属性的值为 undefined

    在使用 andt design 的时候遇到个需求,需要清除 Select 组件选中后的值,让它变成什么都没选中,显示 placeholder 刚开始以为设置为 null 即可,结果发现设置为 null ...

  2. 关于GLSL中语法和调用规则的一些记录

    glsl是什么就不多说了.这里只介绍一下glsl中一些限定符. glsl中包含两类具有定义性质的符号,一类是和c++中定义变量的一样的符号,用来说明存放数据的类型,如float,int,bool.还有 ...

  3. Java中传入一个时间范围,取出该时间范围内所有日期的集合

    直接上代码: import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; impor ...

  4. H5_0010:JS动态创建CSS,并向CSS中传入参数值

    1,在html中定义style 2,js中创建css,并添加进入head标签style中 !function(e, t, i) { n.classList && n.classList ...

  5. mapper.xml文件中传入list参数报错 ‘ ’附近有语法错误

    mapper.xml文件中传入list参数,使用foreach循环遍历值,但是在遍历的过程中出错了,具体代码如下所示 mapper.xml <select id="selectByCo ...

  6. 向shell脚本中传入参数

    写一个 程序名为    test.sh    可带参数为 start 和 stop 执行  test.sh start执行  start 内容的代码 执行 test.sh stop 执行 stop 内 ...

  7. GLSL 中的光照计算

    理论知识转载地址:http://blog.csdn.net/ym19860303/article/details/25545933 1.Lambert模型(漫反射) 环境光: Iambdiff = K ...

  8. cocos2d中如何使用图片纹理图集的加载来实现一个动画的功能

    cocos2d中要实现一个动画,一般采用纹理图集的方式,也就是说把几个连续动作的图片挨个显示切换这样就是动画 一: 首先先看下今天要实现的具体的目的,打飞机的时间屏幕上会有一个喷火的小飞机,飞机的尾部 ...

  9. asp.net mvc 强类型视图中传入List 数据到控制器

    问题来源: 在和一位技术老师聊天时,老师问我一个mvc 表单提交的问题,问道:怎样在表单提交的时候,将 带有 List 属性的对象传入控制器? 这时,我有点呆了,以前一直都好像是 单一属性的表单提交, ...

随机推荐

  1. DISTINCT 与 GROUP BY 的比较

    看了很多文章,这两个SQL语句在不同的数据库上面的实现上可能有相同或有不同,但是应当要明确它们在功能概念上的区别,最终得出结论: GROUP BY 用来使用聚集函数获得值,比如 AVG, MAX, M ...

  2. Mysql----数据备份、pymysql模块

    一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 掌握: #1. 测试+链接 ...

  3. eclipse 中 大小写切换:ctrl+shift+x 转为大写 ctrl+shift+y 转为小写

    ...............

  4. Docker实现跨主机互联

    首先修改一台docker的默认网络段 修改配置文件/usr/lib/systemd/system/docker.service 设置生效(重载配置文件并且重启) systemctl daemon-re ...

  5. 开放思源 专注高效 HPE&msup软件技术开放日回顾

    7月22日,HPE和msup联合举办的软件技术开放日在上海浦东新区张江高科技园区召开,主.分会场共邀请HPE 13 名测试.质量.大数据专家分享技术实践与经验,与180多名测试总监一起拆解质量保障及大 ...

  6. sklearn学习_01

    # -*- coding: utf-8 -*- """ Created on Fri Sep 29 11:05:52 2017 机器学习之sklearn @author: ...

  7. Linux:获取当前进程的执行文件的绝对路径

    摘要:本文介绍Linux的应用程序和内核模块获取当前进程执行文件绝对路径的实现方法. 注意:使用此方法时,如果执行一个指向执行文件的链接文件,则获得的不是链接文件的绝对路径,而是执行文件的绝对路径. ...

  8. ubuntu x64 debootstrap

      sudo debootstrap jessie /mnt/jessie http://mirrors.163.com/debian

  9. [LeetCode] 844. Backspace String Compare_Easy tag: Stack **Two pointers

    Given two strings S and T, return if they are equal when both are typed into empty text editors. # m ...

  10. pop to 特定的UIViewController

    1. 我们可以推出到特定的UIViewController 2. 有一个类没有navigationController,以前一般用delegate,我觉得我们可以把引用一个navigationCont ...