sampler2D и samplerCube в одном шейдере - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь использовать 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)? И какой лучший способ сделать это? Что будет более продуктивным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...