- 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/
我的游戏渲染了许多立方体,这些立方体随机具有 12 种纹理中的一种。我已经对几何体进行了 Z 排序,因此我不能只使用 texture1 然后 2 然后 3 等渲染所有立方体......因为这会破坏 z
我正在尝试绘制一些简单的 3D 直角棱镜,但 glBindTexture 似乎无法正常工作。 我有 N 个“片段”,每个片段都有一个 Material 名称。 我遍历每一 block ,根据其 Mat
我已经看到缓存了当前 GL 纹理名称的示例代码(尤其是在 iOS GL 项目中),并且在调用 glBindTexture 之前进行了比较。目标是避免对 glBindTexture 的不必要调用。 例如
我正在寻找 glActiveTexture(...) 之间的关系和 glBindTexture(...)我找到了 awesome answer here ,最重要的答案(作者/用户 Alfonse)为
这是我用来绘制 Sprite 的方法: public void DrawSprite(Sprite sprite) { Gl.glBegin(Gl.GL_TRI
我正在渲染棋盘,使用 2 种不同的纹理。一个用于黑色方 block ,一个用于白色方 block 。然而,不是每个不同的正方形都有自己的纹理,它们都采用我调用 glBindTexture(GL_TEX
glBindImageTexture 和 glBindTexture 有什么区别?以及着色器中以下声明之间的区别是什么: layout (binding = 0, rgba32f) uniform i
我正在使用 Cocoa + OpenGL 为 MacOS 构建一个小游戏来创建 GUI。该游戏是 BoulderDash-Clone,因此它基本上是一个 2D 对象数组,而且数量不多(一个关卡大约有
据我所知,glActiveTexture设置事件的“纹理单元”。每个纹理单元可以有多个纹理目标(通常是 GL_TEXTURE_1D、2D、3D 或 CUBE_MAP)。 如果我理解正确,您必须调用gl
如何关闭纹理单元,或者至少在绑定(bind)纹理时防止其状态发生变化?我正在使用着色器,所以我认为没有 glDisable 。问题是事件链可能看起来像这样: Create texture 1 (imp
OpenGL 中 glframebuffertexture 和 glbindtexture 这两个函数在使用上的具体区别是什么。 具体来说,我正在使用 OpenTK 使用 OpenGL 为嵌入式机器编
我正在尝试为 OpenGL/V8/JavaScript 中的纹理使用实现 OpenGL 绑定(bind)。 我的问题很简单: OpenGL 的 glBindTexture() 方法需要一个指向 GLu
我还是 opengl3 的新手,我正在尝试创建多 channel 渲染。 为此,我创建了 FBO,生成了多个纹理并使用 将它们附加到它上面 unsigned index_col = 0;
我正在多 GPU 设置(Mac Pro 2013 年末)中开发 OS X 应用程序,该应用程序使用 OpenCL(在辅助 GPU 上)生成纹理,稍后使用 OpenGL 将其绘制到屏幕上(在主 GPU)
我正在使用 C++ 和 Opengl,我正在尝试使用 SOIL,但是当我编译时,我得到了对 glBindTexture、glTexImage2D 等的 undefined reference 。但是,
我正在尝试将 OpenCV cv::Mat 图像转换为 OpenGL 纹理(我需要一个指向纹理的 GLuint)。到目前为止,这是我从大量 Google 搜索中拼凑而成的代码: void otherF
我的一个纹理在 OpenGL 上有一个糟糕的行为。 删除纹理后,我创建一个新纹理,它生成与之前相同的 tex 编号,但纹理不正确。另外 glGetError 在每一行总是返回 0!我试图在 glDel
请问一个关于 iOS 5.0 框架中的 GLKit 的快速问题。 如果您使用 GLKTextureLoader,它是否只加载当前事件纹理单元中的纹理?我查看了示例,但没有看到您必须说变量 x 中的 G
我是 OpenGL 新手,我的纹理有一个奇怪的问题 - 寻找正确方向的插入。 我有一个应用程序,它使用渲染纹理技术来实现某种效果 - 它运行得非常好。每次需要时,我都会绘制到屏幕外缓冲区,并且能够在渲
您好,我要在显示器中绘制 35 张图像。我在 7X5 网格中绘制它。图片是从网上下载的。每次下载图像时,我都会尝试绘制全部 35 张图像。但其中一些尚未下载。所以我为他们绘制了一些默认图 block
我是一名优秀的程序员,十分优秀!