- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我所知,glActiveTexture
设置事件的“纹理单元”。每个纹理单元可以有多个纹理目标(通常是 GL_TEXTURE_1D、2D、3D 或 CUBE_MAP)。
如果我理解正确,您必须调用glActiveTexture
首先设置纹理单元(初始化为 GL_TEXTURE0
),然后将(一个或多个)“纹理目标”绑定(bind)到该纹理单元?
可用纹理单元的数量取决于系统。我在我的库中看到了多达 32 个的枚举。我想这基本上意味着我可以在任何时候在 GPU 内存中拥有 GPU 的限制(我认为是 16 8 个)和 32 个纹理中的较小者?我想还有一个额外的限制,即我不超过 GPU 的最大内存(假设为 1 GB)。
我是否正确理解了纹理目标和纹理单元之间的关系?假设我允许每个单位有 16 个单位和 4 个目标,这是否意味着有空间容纳 16*4=64 个目标,还是不能这样工作?
接下来,您通常要加载纹理。您可以通过 glTexImage2D
执行此操作.其中的第一个参数是纹理目标。如果这个 works like glBufferData
,然后我们本质上将“句柄”/“纹理名称”绑定(bind)到纹理目标,然后将纹理数据加载到该目标中,从而间接将其与该句柄相关联。
怎么样glTexParameter
?我们必须绑定(bind)一个纹理目标,然后再次选择相同的目标作为第一个参数?还是只要我们有正确的事件纹理单元就不需要绑定(bind)纹理目标?glGenerateMipmap
也对目标进行操作...该目标仍必须绑定(bind)到纹理名称才能成功?
那么当我们想要绘制带有纹理的对象时,我们是否必须同时选择一个事件纹理单元,然后选择一个纹理目标?还是我们选择一个纹理单元,然后我们可以从与该单元关联的 4 个目标中的任何一个获取数据?这是真正让我感到困惑的部分。
最佳答案
所有关于 OpenGL 对象
OpenGL 对象的标准模型如下。
对象有状态。将它们视为 struct
.所以你可能有一个像这样定义的对象:
struct Object
{
int count;
float opacity;
char *name;
};
Object
的实例,您将按如下方式更改其状态:
obj.count = 5;
您可以直接引用对象的一个实例,获取您想要更改的特定状态,然后将一个值插入其中。
glBind*
的一些文件完成的。打电话。
Object *g_objs[MAX_LOCATIONS] = {NULL};
void BindObject(int loc, Object *obj)
{
g_objs[loc] = obj;
}
glBind*
调用有一个“目标”参数。这表示 OpenGL 上下文中可以绑定(bind)该类型对象的不同位置。例如,您可以绑定(bind)一个帧缓冲区对象用于读取(
GL_READ_FRAMEBUFFER
)或用于写入(
GL_DRAW_FRAMEBUFFER
)。这会影响 OpenGL 使用缓冲区的方式。这是什么
loc
上面的参数代表。
GL_TEXTURE_2D
时,您实际上是在纹理中设置特殊状态。你是说这个纹理是一个 2D 纹理。它永远是 2D 纹理;这种状态永远无法改变。如果您的纹理首先绑定(bind)为
GL_TEXTURE_2D
,您必须始终将其绑定(bind)为
GL_TEXTURE_2D
;试图将其绑定(bind)为
GL_TEXTURE_1D
会引起错误(在运行时)。
void ObjectParameteri(int loc, ObjectParameters eParam, int value)
{
if(g_objs[loc] == NULL)
return;
switch(eParam)
{
case OBJECT_COUNT:
g_objs[loc]->count = value;
break;
case OBJECT_OPACITY:
g_objs[loc]->opacity = (float)value;
break;
default:
//INVALID_ENUM error
break;
}
}
loc
值(value)。
glTexParameter
.唯一改变纹理状态的其他函数是
glTexImage
函数及其变体(
glCompressedTexImage
、
glCopyTexImage
、最近的
glTexStorage
)。各种
SubImage
版本会更改纹理的内容,但在技术上不会更改其状态。
Image
函数分配纹理存储并设置纹理的格式;
SubImage
函数只是复制周围的像素。这不被视为纹理的状态。
glTexEnv
修改环境状态;它不会影响存储在纹理对象中的任何内容。
glActiveTexture
进来。
GL_TEXTURE_1D
、
GL_TEXTURE_CUBE_MAP
等)。还有纹理单元。就我们的 C/C++ 示例而言,我们拥有的是:
Object *g_objs[MAX_OBJECTS][MAX_LOCATIONS] = {NULL};
int g_currObject = 0;
void BindObject(int loc, Object *obj)
{
g_objs[g_currObject][loc] = obj;
}
void ActiveObject(int currObject)
{
g_currObject = currObject;
}
Object
的二维列表。 s,但我们也有当前对象的概念。我们有一个函数来设置当前对象,我们有当前对象的最大数量的概念,我们所有的对象操作函数都被调整为从当前对象中选择。
glActiveTexture
不取整数;它需要一个枚举器。这在理论上意味着它可以从
GL_TEXTURE0
中获取任何东西。至
GL_TEXTURE31
.但是你必须明白一件事:
glActiveTexture
的实际范围可以服用受
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
管辖.这是实现允许的最大同时多纹理数。对于不同的着色器阶段,它们每个都分为不同的组。例如,在 GL 3.x 类硬件上,您将获得 16 个顶点着色器纹理、16 个片段着色器纹理和 16 个几何着色器纹理。因此,
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
将是 48。
glActiveTexture
并不真正需要枚举器。
正确 拨打方式
glActiveTexture
如下:
glActiveTexture(GL_TEXTURE0 + i);
i
是介于 0 和
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
之间的数字.
glUniform1i(samplerLoc, i)
,其中
i
是图像单元)。那代表您与
glActiveTexture
一起使用的数字.采样器将根据采样器类型选择目标。所以一个
sampler2D
将从
GL_TEXTURE_2D
中挑选目标。这是采样器具有不同类型的原因之一。
关于opengl - glActiveTexture 和 glBindTexture 的区别和关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8866904/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!