Я пытаюсь использовать sampler2D
и samplerCube
в одном шейдере. Я делал это, используя struct
для нескольких sampler2D
. Но теперь я решил прекратить помещать их в struct
и заметил несколько особенностей. Если я положу sampler2D
в struct
, достаточно связать samplerCube
1 раз. Но если я положу sampler2D
вне структуры, мне придется связывать samplerCube
каждый раз, когда я рисую каждую модель. Ниже я привожу примеры псевдокода.
sampler2D
в struct
:
uniform samplerCube shadowMaps;
uniform struct Mapping {
sampler2D ambientMapping;
sampler2D diffuseMapping;
sampler2D specularMapping;
sampler2D normalMapping;
} mapping;
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
}
sampler2D
снаружи struct
:
uniform samplerCube shadowMaps;
uniform sampler2D ambientMapping;
uniform sampler2D diffuseMapping;
uniform sampler2D specularMapping;
uniform sampler2D normalMapping;
C ++ псевдокод:
// 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
}
Почему во втором случае я должен каждый раз делать glBindTexture(GL_TEXTURE_CUBE_MAP, shadowMapId)
? И какой лучший способ сделать это? Что будет более продуктивным?