【问题标题】:Is there any limitation of using sampler2D array in OpenGL在 OpenGL 中使用 sampler2D 数组有什么限制吗
【发布时间】:2019-07-16 08:13:15
【问题描述】:

我在我的 glsl 程序中使用 sampler2d 数组:

uniform sampler2D diffuseMaps[100]; 

我通过了如下纹理:

for (int i = 0 ; i < textures.size() ; i++)
{ 
    glActiveTexture(GL_TEXTURE0 + i);
    glBindTexture(GL_TEXTURE_2D, textures[i]->textureId);

    std::string name = "diffuseMaps[" + std::to_string(i) + "]";
    GLuint loc = glGetUniformLocation(shader->getHandle(), name.c_str());
    glUniform1i(loc, i);
}

效果很好,我有 80 个纹理,而 OpenGL 的索引不超过 GL_TEXTURE31

它是否只适用于我的硬件 (GTX 1070Ti)?

其他硬件呢?

我可以使用的纹理数量有什么限制吗?

【问题讨论】:

    标签: opengl glsl


    【解决方案1】:

    一个人可以创建多少个纹理没有限制,但是一个着色器可以同时使用多少个纹理是有限制的。这是由MAX_TEXTURE_IMAGE_UNITS 定义的。在 OpenGL 4.X 中,至少可以使用 16 个纹理,尽管 GPU 可能允许您使用更多。在撰写本文时,任何硬件都不太可能允许您同时对 80 个纹理进行采样。

    当您需要更多纹理时,您应该考虑使用至少支持 256 层的array texture。另一种选择是将纹理合并为 3D 纹理。

    【讨论】:

    • 非常有用的谢谢,只是另一个问题,我做 glActiveTexture(GL_TEXTURE0 + i);当“i”大于 32 时,我有 GL_ACTIVE_TEXTURE 和 GL_MULTISAMPLE .... 这是一个问题吗?
    • 这是一个问题:这取决于。您的硬件是否支持超过 32 种纹理?
    • 我的意思是当 i 大于 32 时,实际上我有 glActiveTexture(GL_TEXTURE31) , glActiveTexture(GL_ACTIVE_TEXTURE) , glActiveTexture(GL_MULTISAMPLE) ,...
    • glActiveTexture 只能接受 GL_TEXTURE0 ... GL_TEXTURE31
    • @masoudkhanlo:现在明白了。我不认为 OpenGL 已经考虑过这一点。目前只定义了 32 个常量。但我不知道有什么硬件支持更多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多