Проблема с чтением нескольких текстурных блоков из шейдера в OpenGL - PullRequest
1 голос
/ 16 февраля 2011

Я пытаюсь прочитать две разные текстуры в моем шейдере, одну для обычного текстурирования и одну рельефную карту.Однако оба Sampler2D читают из одного и того же текстурного блока.Я устанавливаю униформу на 0 и 1, однако, и я привязал текстуры к соответствующим им единицам следующим образом:

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texMgr->GetTexture("stone")->texture);

glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texMgr->GetTexture("bump")->texture);

В моем цикле рендеринга я установил униформу следующим образом:

shaderMgr->activeProgram()->setUniform1f("tex", 0);
shaderMgr->activeProgram()->setUniform1f("norm", 1);

И, наконец, мой код шейдера:

varying vec4 colorVarying;
varying vec4 normalVarying;
varying vec3 lightDirVarying;
varying vec2 textureCoordinateVarying;

uniform sampler2D tex;
uniform sampler2D norm;

void main() {    
    vec4 texColor = texture2D(tex, textureCoordinateVarying);
    vec4 normColor = texture2D(norm, textureCoordinateVarying);
    vec3 newNormal = vec3(2.0 * normColor.x - 1.0, 2.0 * normColor.y - 1.0, 2.0 * normColor.z - 1.0);
    vec3 normal = normalize(normalVarying.xyz + newNormal);
    float diff = max(0.0, dot(normal, normalize(lightDirVarying)));

    gl_FragColor = texColor * (diff + 0.3);
}

Я вызываю glActiveTexture в моем renderloop каждый раз, когда рисую объект, и вызываю glActiveTexture (GL_TEXTURE1) только один раз (при моей инициализации).

glActiveTexture(GL_TEXTURE0);
glBindTexture( GL_TEXTURE_2D, object->tex->texture);

Все отлично работает для первой текстуры, но вторая текстура (Bump) не появляется.Я пробовал:

  • Добавляя ARB ко всему, я не уверен, имеет ли это значение.(Я использую OSX 10.6, если это имеет смысл)
  • Добавление glEnable (GL_TEXTURE_2D) каждый раз, когда я переключаю текстурные блоки.
  • Не переключаюсь между программами, а просто запускаю с одним шейдером,и установите униформу в моей инициализации
  • Сброс параметров текстуры каждый раз, когда я переключаю текстурные блоки.
  • Не переключаюсь между TextureUnits, а только инициализирую их в начале
  • Запущеноновый проект, только скопировал соответствующий код и запустил его, сохранил его как можно меньшим

Все это не помогло, сэмплер норм только читает модуль GL_TEXTURE0.

Я искал часы, и до сих пор не нашел ответа.Я понятия не имею, что я делаю неправильно и почему мой нормальный сэмплер не читает с правильного блока GL_TEXTURE1.

1 Ответ

5 голосов
/ 16 февраля 2011
shaderMgr->activeProgram()->setUniform1f("tex", 0);

Если это вызывает glUniform1f, это неправильно, вы должны использовать glUniform1i для установки сэмплеров текстуры.

...