当前位置: 首页 > news >正文

网站设计制作全网优惠100元建网站

网站设计制作全网优惠,100元建网站,wordpress中文免费企业主题,国际新闻联播一、前言 在OpenGL学习 的纹理这一章中讲述了纹理贴图的使用方式#xff0c;主要步骤是先创建一个纹理的对象#xff0c;和创建顶点VAO类似#xff0c;然后就开始绑定这个纹理#xff0c;最后在循环中使用#xff0c;有时候可能还要用到激活纹理单元的函数。然而#xff…一、前言 在OpenGL学习 的纹理这一章中讲述了纹理贴图的使用方式主要步骤是先创建一个纹理的对象和创建顶点VAO类似然后就开始绑定这个纹理最后在循环中使用有时候可能还要用到激活纹理单元的函数。然而对于何时应该激活如何和shader里的纹理编号进行绑定没有详细的说明导致在使用的时候产生了不少困惑。比如何时应该绑定绑定后的索引如何匹配。 在这一章的第一个效果案例显示一个带贴图纹理的箱子时只用到了绑定而没有用到激活部分主要代码如下即使这样在shader中也能让贴图获取到这里写进去的数据。 while (!glfwWindowShouldClose(window)){-----glBindVertexArray(VAO);-----}其shader的片段着色器代码如下这个片段的“texture1”数据在上述循环中并未明确指定传过来的 // texture sampler uniform sampler2D texture1;void main() {FragColor texture(texture1, TexCoord); } 这是我第一个猜想如果C代码中只创建了一个纹理数据不用激活和指定传输到片段着色器中使用“ glBindTexture(GL_TEXTURE_2D, texture);”函数可以默认将片段着色器中的贴图都填充同样的数据。带着这个猜想我开始验证我的想法。 二、实现 2.1、如果只有一个贴图数据默认传输到片段着色器的每一个“uniform sampler2D” 其他都不变我只修改片段着色器代码首先我创建了两个uniform sampler2D变量分别为texture1和texture2然后稍微修改其片段着色器代码如下如果这两个片段都获取到同样的数据则显示两倍的贴图效果如果不相等则屏幕显示一个绿色的片。 // texture sampler uniform sampler2D texture1; uniform sampler2D texture2; void main() {vec4 tempColor1texture(texture1, TexCoord);vec4 tempColor2texture(texture2,TexCoord);if(tempColor1tempColor2){FragColor tempColor1tempColor2;}elseFragColorvec4(0,1,0,1); } 试验的结果得到如下明显比之前要亮一点很显然两个贴图都获取到循环里传输过来的贴图数据而且是一样的。 图2.1.1 2.2、如果C代码只有一个贴图但我就想传给片段着色器中指定的纹理 1只激活第一个并不管用这个时候我尝试使用激活我只激活第一个试试结果和图2.1.1是一样的两个纹理还是被传输一样的纹理数据。 glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, texture); 2两个都激活但只赋值给第二个贴图结果两个都没有得到数据再尝试不同的激活方式保持只传输一个纹理数据的逻辑将第一个激活然后不赋值激活第二个并且赋值贴图纹理理论上这样应该是可以的啊结果变成了黑的如图2.2.1所示 glActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, 0);glActiveTexture(GL_TEXTURE1);glBindTexture(GL_TEXTURE_2D, texture); 图2.2.1 是不是两个贴图都没有获取到数据呢我还不确定再修改片段着色器判断一下如果确实没有获取到数据则让屏幕显示“黄色”的箱子结果如图2.2.2所示确实显示了黄色的箱子这说明我们 uniform sampler2D texture1; uniform sampler2D texture2; void main() {vec4 tempColor1texture(texture1, TexCoord);vec4 tempColor2texture(texture2,TexCoord);if(tempColor1tempColor2){if(tempColor1vec4(0,0,0,1)){FragColorvec4(1,1,0,1);}elseFragColor tempColor1tempColor2;}elseFragColorvec4(0,1,0,1); } 图2.2.2 贴图数据始终还是以默认的方式进行传输第二个激活并传输并没有奏效始终还是第一个激活才奏效。 3再增加一个贴图的索引结果可以精准的将数据传输到第二个贴图代码如下在激活之前给 ourShader.setInt(texture2, 1);// bind TextureglActiveTexture(GL_TEXTURE0);glBindTexture(GL_TEXTURE_2D, 0);glActiveTexture(GL_TEXTURE1);glBindTexture(GL_TEXTURE_2D, texture); 当前的shader指定一个索引1并且这个索引数值“1”一定要和后续绑定的“GL_TEXTURE1”对应最后得到的结果是绿色的一个箱子说明在片段着色器中贴图的数据不一样了。 三、总结 3.1、如果只有一个贴图数据在C中只用默认的绑定操作默认传输到片段着色器的每一个“uniform sampler2D”变量中。 3.2、如果要指定传输给片段着色器中一定要使用激活贴图 glActiveTexture(GL_TEXTURE1);和        设置索引号ourShader.setInt(texture2, 1);同时使用并且激活的序列号和设置索引值要相等只使用索引也不行。 3.3、激活和设置索引以及绑定都要在循环里每帧都使用尝试将索引设置不放在循环里也不行。 3.4、激活和绑定都是默认的情况下设置索引没有任何作用可以不用。比如在文章后续做一个2D游戏中的一篇文章里渲染精灵 其最后的游戏类代码中初始化时设置了纹理image的数据索引为0但是其着色器代码中并没有”image“这个变量而且此处 void Game::Init() {......ResourceManager::GetShader(sprite).Use().SetInteger(image, 0);....... } 无论你修改”image为任何变量比如“imageeeeeeeeeeeeeeee它依然能显示正确的结果因为这一篇文章中就是一个默认的贴图而且激活和绑定都是执行默认的0这里的索引就不会发生任何作用。
http://www.tj-hxxt.cn/news/231399.html

相关文章:

  • 站长工具在线陕西建设厅官网首页
  • 平凉崆峒建设局网站我要建立自己的网站
  • 女朋友在互联网公司做网站成都住建局官网住建局
  • 网站建设的费用计什么科目杭州小程序搭建
  • 建筑网站推荐知乎wordpress安装主题后无法查看媒体
  • 2017 上海网站备案php 网站 下载
  • 哈尔滨网站建设团队西安企业家名单
  • 简述网站技术解决方案鄂伦春网站建设
  • 国内高端大气的网站设计设计院一般年薪
  • 做视频搬运工的网站海南住房建设厅定额网站
  • 郑州php网站建设外包公司一个人头挣多少钱
  • 东莞做网站优化哪家好网站设计的风格有哪些
  • 山东住房建设厅官网站网站设计 用户心理研究
  • 网站系统建设网站建设服务器环境配置
  • 做情侣网站电子商务网站建设学什么软件
  • 龙之向导外贸经理人网站东莞网站建设对比
  • 哪个网站可以找题目给小孩做朝阳市网站建设
  • 时尚网站设计案例如何做图片网站
  • 大数据培训班需要多少钱百度seo快速见效方法
  • 上海做网站的公Wordpress 新建标签
  • 做网站怎么排版好看最新新闻热点事件2022年
  • 西安企业免费建站装修加盟
  • 湖南营销型网站建设多少钱广州电子商务网站建设费用
  • 电子商务网站建设利益分析网站制作公司前十排名
  • 镇江网站建设案例杭州平面设计培训
  • 企业网站主页设计工作态度和责任心句子
  • 网站整合建设是啥意思网站建设十
  • 网站建设 金手指排名霸屏wordpress 购买会员
  • 重庆网站seo什么意思iis怎么做网站
  • 网站建设 开办费太仓seo网站优化软件