Opengl sampler2D和samplerCube在一个着色器中

Opengl sampler2D和samplerCube在一个着色器中,opengl,glsl,Opengl,Glsl,我试图在一个着色器中使用sampler2D和samplerCube。我过去常常使用struct对一些sampler2D执行此操作。但是现在我决定不再把它们放在结构中,并且注意到了几个特性。如果我将sampler2D放入struct,绑定samplerCube一次就足够了。但是,如果我将sampler2D放在结构外部,每次绘制每个模型时,我都必须绑定samplerCube。下面我给出伪代码的示例 sampler2D转换为struct: uniform samplerCube shadowMaps;

我试图在一个着色器中使用
sampler2D
samplerCube
。我过去常常使用
struct
对一些
sampler2D
执行此操作。但是现在我决定不再把它们放在结构中,并且注意到了几个特性。如果我将
sampler2D
放入
struct
,绑定
samplerCube
一次就足够了。但是,如果我将
sampler2D
放在结构外部,每次绘制每个模型时,我都必须绑定
samplerCube
。下面我给出伪代码的示例

sampler2D
转换为
struct

uniform samplerCube shadowMaps;
uniform struct Mapping {
    sampler2D ambientMapping;
    sampler2D diffuseMapping;
    sampler2D specularMapping;
    sampler2D normalMapping;
} mapping;
uniform samplerCube shadowMaps;
uniform sampler2D ambientMapping;
uniform sampler2D diffuseMapping;
uniform sampler2D specularMapping;
uniform sampler2D normalMapping;
C++伪代码:

// somewhere in init
// samplerCube
glUniform1i(shadow, 4);
glActiveTexture(GL_TEXTURE4);
glBindTexture(GL_TEXTURE_CUBE_MAP, shadowMapId);

// ...

// drawing models
for (size_t i = 0; i < MODELS_COUNT; i++) {
    glUniform1i(model[i].ambientMapping, 0);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, model[i].texturesIds[0]);

    glUniform1i(model[i].diffuseMapping, 1);
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, model[i].texturesIds[1]);
    // analogically for specular and normal

    // model
}
// drawing models
for (size_t i = 0; i < MODELS_COUNT; i++) {
    glUniform1i(model[i].ambientMapping, 0);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, model[i].texturesIds[0]);

    glUniform1i(model[i].diffuseMapping, 1);
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, model[i].texturesIds[1]);
    // analogically for specular and normal

    // samplerCube
    glUniform1i(shadow, 4);
    glActiveTexture(GL_TEXTURE4);
    glBindTexture(GL_TEXTURE_CUBE_MAP, shadowMapId);

    // model
}
C++伪代码:

// somewhere in init
// samplerCube
glUniform1i(shadow, 4);
glActiveTexture(GL_TEXTURE4);
glBindTexture(GL_TEXTURE_CUBE_MAP, shadowMapId);

// ...

// drawing models
for (size_t i = 0; i < MODELS_COUNT; i++) {
    glUniform1i(model[i].ambientMapping, 0);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, model[i].texturesIds[0]);

    glUniform1i(model[i].diffuseMapping, 1);
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, model[i].texturesIds[1]);
    // analogically for specular and normal

    // model
}
// drawing models
for (size_t i = 0; i < MODELS_COUNT; i++) {
    glUniform1i(model[i].ambientMapping, 0);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, model[i].texturesIds[0]);

    glUniform1i(model[i].diffuseMapping, 1);
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, model[i].texturesIds[1]);
    // analogically for specular and normal

    // samplerCube
    glUniform1i(shadow, 4);
    glActiveTexture(GL_TEXTURE4);
    glBindTexture(GL_TEXTURE_CUBE_MAP, shadowMapId);

    // model
}
//绘图模型
对于(大小i=0;i

为什么在第二种情况下,我每次都要做
glBindTexture(GL\u TEXTURE\u CUBE\u MAP,shadowMapId)
?最好的方法是什么?什么更有效率?

所以您有“计数”
samplerCube
和4
sample2d
。但你似乎以相反的方式传递纹理单元。@Ripi2已编辑、删除
COUNT