OpenGL ES 中着色器变量 sampler2D 并不是在宿主语言中指定的数字 0...

OpenGL ES 中着色器变量 sampler2D 并不是在宿主语言中指定的数字 0...

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。

如题,这部分只有看得懂的才能知道下面说的是什么。

在宿主语言中给着色器程序中的全局变量设定相应的值,如下:

    // 加载可用纹理单元
    glUniform1i(_sampler0Slot, 0);
    glUniform1i(_sampler1Slot, 1);

着色器中这两个变量的声明如下:

uniform sampler2D Sampler0;
uniform sampler2D Sampler1;

当进行绘制时,渲染管线在适当时机调用相应的着色器程序,并传入相应的以上变量在宿主语言中设置的值。

着色器中这两个变量的使用如下:

void main()
{
    vec4 dst = texture2D(Sampler0, vTextureCoordOut);
    vec4 src = texture2D(Sampler1, vTextureCoordOut);
    ......

}

这里使用的 Sampler0 和 Sampler1 并不像其它类型变量一样,按宿主语言中给定的值,直接换成相应的数值,就能跑起来。

这中间渲染管线根据宿主语言中设置的数值指定的位置,找到相应的纹理单元,并把该纹理单元上挂载的纹理对象取出来,传给相应的  Sampler0 和 Sampler1 。

而且得使用着色器语言内置的取纹理方法 texture2D 等,使用传入的纹理坐标从这个纹理对象中取适当范围内的图像颜色。

这样一个顶点的颜色,就可以由这个顶点的纹理坐标从指定的纹理中取出来。

有一点不能忽略,顶点并不是一个坐标,而是三个坐标,三个坐标构成一个顶点,不过有时也只会有一个顶点的几何坐标而已。

还有一点不太明白,即然纹理中的图片上某个范围象素是有颜色的了,那么,如果没有灯光的话,不也一样可以呈现颜色,被看到吗?

那么灯光是如何与纹理相互作用的呢?

为什么还必须要烘焙图,才可以在没有灯光作用的情况下就可以被看到呢?

灯光的几个要素,在纹理中是如何起物理或化学反应的呢?

可能也许是视觉或情神反应吧!。。。。。。

不急,不急!!!象我一样,即然很郁闷,也要调整一下心态,这样才能迸发出更多的灵感,希望你也一样。

如果您知道上面的问题答案,也请帮忙回复解答,老生在此有理了也。

				
时间: 2024-09-24 16:00:40

OpenGL ES 中着色器变量 sampler2D 并不是在宿主语言中指定的数字 0...的相关文章

OpenGL ES 着色器中问题解决技巧

OpenGL ES 着色器中问题解决技巧 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 灰暗的一天, 终于见到一丝曙光, 心情终于从沉重变得略有轻松, 虽然, 一早就明白, 曙光终究会闪现,

《OpenGL编程指南(原书第9版)》——2.6 着色器子程序

2.6 着色器子程序 高级技巧GLSL允许我们在着色器中定义函数,而这些函数的调用过程总是静态的.如果需要动态地选择调用不同的函数,那么可以创建两个不同的着色器,或者使用if语句来进行运行时的选择,如例2.5所示.例2.5 静态着色器的控制流程 着色器子程序在概念上类似于C语言中的函数指针,它可以实现动态子程序选择过程.在着色器当中,可以预先声明一个可用子程序的集合,然后动态地指定子程序的类型.然后,通过设置一个子程序的uniform变量,从预设的子程序中选择一个并加以执行.2.6.1 GLSL

《OpenGL编程指南》一2.6 着色器子程序

2.6 着色器子程序 高级技巧GLSL允许我们在着色器中定义函数,而这些函数的调用过程总是静态的.如果需要动态地选择调用不同的函数,那么可以创建两个不同的着色器,或者使用if语句来进行运行时的选择,如例2.5所示.例2.5 静态着色器的控制流程 着色器子程序在概念上类似于C语言中的函数指针,它可以实现动态子程序选择过程.在着色器当中,可以预先声明一个可用子程序的集合,然后动态地指定子程序的类型.然后,通过设置一个子程序的uniform变量,从预设的子程序中选择一个并加以执行. 2.6.1 GLS

《OpenGL编程指南(原书第9版)》——2.7 独立的着色器对象

2.7 独立的着色器对象 高级技巧 在OpenGL 4.1版本之前(不考虑扩展功能),在应用程序中,同一时间只能绑定一个着色器程序.如果你的程序需要使用多个片元着色器来处理来自同一个顶点着色器的几何体变换数据,那么这样会变得很不方便.此时只能将同一个顶点着色器复制多份,并且多次绑定到不同的着色器程序,从而造成了资源的浪费和代码的重复. 独立的着色器对象可以将不同程序的着色阶段(例如顶点着色)合并到同一个程序管线中. 第一步,我们需要创建用于着色器管线的着色器程序.我们可以调用glProgramP

《OpenGL编程指南》一第2章 着色器基础

第2章 着色器基础 本章目标阅读完本章内容之后,你将会具备以下能力:区分OpenGL创建图像所用的不同类型的着色器.使用OpenGL着色语言构建和编译着色器.使用OpenGL中提供的多种机制将数据传入着色器.使用高级GLSL着色技巧来创建可复用性更强的着色器.本章将介绍如何在OpenGL中使用可编程着色器(shader).首先介绍OpenGL着色语言(OpenGL Shading Language,通常也称作GLSL),然后详细解释着色器将如何与OpenGL应用程序交互.这一章将会包含以下几节:

《OpenGL编程指南》一2.7 独立的着色器对象

2.7 独立的着色器对象 高级技巧在OpenGL 4.1版本之前(不考虑扩展功能),在应用程序中,同一时间只能绑定一个着色器程序.如果你的程序需要使用多个片元着色器来处理来自同一个顶点着色器的几何体变换数据,那么这样会变得很不方便.此时只能将同一个顶点着色器复制多份,并且多次绑定到不同的着色器程序,从而造成了资源的浪费和代码的重复.独立的着色器对象可以将不同程序的着色阶段(例如顶点着色)合并到同一个程序管线中.第一步,我们需要创建用于着色器管线的着色器程序.我们可以调用glProgramPara

《Unity着色器和屏幕特效开发秘笈(原书第2版)》一1.5 在表面着色器中使用属性

本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第1章,第1.5节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问"华章计算机"公众号查看 1.5 在表面着色器中使用属性 我们已经创建了一些属性,现在在着色器中开始试着把这些属性用起来,通过这些属性让材质的微调过程更加高效.可以通过材质的Inspector标签页得到这些属性的值,因为我们给属性绑定了一个变量名.但

OpenGL ES 多个模型导入呈现的公共部分

OpenGL ES 多个模型导入呈现的公共部分 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 为什么要提这个话题呢,是因为多个模型文件obj导入到OpenGL ES中,会有多个纹理库,多个几何

OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例》一6.3 定位光与定向光

6.3 定位光与定向光 OpenGL ES 2.0游戏开发(上卷):基础技术和典型案例上一节中介绍的光照效果都是基于定位光光源的,定位光光源类似于现实生活中的白炽灯灯泡,其在某个固定的位置,发出的光向四周发散.定位光照射的一个明显特点就是,在给定光源位置的情况下,对不同位置的物体产生的光照效果不同. 现实世界中并不都是定位光,例如照射到地面上的阳光,光线之间是平行的,这种光称为定向光.定向光照射的明显特点是,在给定光线方向的情况下,场景中不同位置的物体反映出的光照效果完全一致.图6-16中对定位