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. css实现表格的td里面的内容居中.

    <td align="center" valign="middle">前一个是水平居中 后一个是垂直居中对应的css写法:<td style= ...

  2. CentOS6.5安装配置PPTP

    本次安装环境为Ucloud云服务器 1,操作系统版本检查 2,安装ppp,pptp yum install -y ppp rpm -ivh http://static.ucloud.cn/pptpd- ...

  3. poj3261 Milk Patterns【后缀数组】【二分】

    Farmer John has noticed that the quality of milk given by his cows varies from day to day. On furthe ...

  4. mysqli_report

    MYSQLI_REPORT_OFF Turns reporting off MYSQLI_REPORT_ERROR Report errors from mysqli function calls M ...

  5. mysql ifnull判断为空设置默认值

    IFNULL(count,0) as count select IFNULL(count,0) as count from table_name 可以设置当某个字段为空的时候默认值.

  6. wxWidgets与其他工具库的比较(下)

    2009-07-25 12:37:51   GTK+       ● GTK+的网站:www.gtk.org:     ● GTK+原本是Gimp的一个工具库,是在LGPL协议下发布的Unix系统GU ...

  7. 大数据智能SOC解决方案

  8. HTTP 协议详解(转载)

    原文: http://kb.cnblogs.com/page/130970/#httpmeessagestructe HTTP协议详解 当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, ...

  9. sql server内置存储过程、查看系统信息

    1.检索关键字:sql server内置存储过程,sql server查看系统信息 2.查看磁盘空间:EXEC master.dbo.xp_fixeddrives , --查看各个数据库所在磁盘情况S ...

  10. 怎么设置输入的EditText字母自己主动大写

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/t80t90s/article/details/25048917 复于: 2013-09-06 09: ...