Как предотвратить повторение текстуры маски с помощью шейдеровC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как предотвратить повторение текстуры маски с помощью шейдеров

Сообщение Anonymous »

Я использую шейдер для создания изображения с альфа-прозрачностью, чтобы эффективно «пробить дыру» в текстуре. У меня все работает отлично, за исключением того, что текстура альфа-прозрачности повторяется. Я хочу, чтобы проходила только одна световая текстура, вместо этого наложенная текстура заполняется дырами в однородном наборе.
Вот мой файл фрагмента:

Код: Выделить всё

#version 330

in vec2 fragmentUV;
in vec2 fragmentPosition;
in vec4 fragmentColor;

out vec4 color;

uniform sampler2D mySampler;
uniform sampler2D myMask;
uniform int useMask;
uniform vec4 lightCoords;

void main() {
vec4 texColor = texture(mySampler, fragmentUV) * fragmentColor;
if(useMask == 1){
vec2 lightUV = (fragmentPosition - lightCoords.xy) / lightCoords.zw;
vec4 maskColor = texture(myMask, lightUV);
texColor *= maskColor;
}

color = texColor;
}
Затем в основном коде я создаю глиф:

Код: Выделить всё

//_glyphs.emplace_back(overlay, UV, blankTexture.id, 0.0f, ColorRGBA8(0, 0, 0, 200)); // Without Mask
_glyphs.emplace_back(overlay, UV, blankTexture.id, 0.0f, ColorRGBA8(0, 0, 0, 200), lightTexture.id); // With Mask
он ​​передает «оверлей» как координаты наложенной текстуры, UV, текстуру, глубину и цвет наложения как RGBA, и, наконец, добавление дополнительной текстуры в конец будет дайте шейдеру знать, что мы можем использовать маску и что переданная текстура ЯВЛЯЕТСЯ маской. Он создает пакет рендеринга, который мы вызываем при рендеринге сцены с помощью:

Код: Выделить всё

    // Draw the render batches.
for (size_t i = 0; i < _renderBatches.size(); i++) {
if (_renderBatches[i].maskTexture) {
glUniform1i(UseMask, 1);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _renderBatches[i].maskTexture);
}
else {
glUniform1i(UseMask, 0);
}
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _renderBatches[i].texture);
glDrawArrays(GL_TRIANGLES, _renderBatches[i].offset, _renderBatches[i].numVertices);
}
По сути, он проверяет маскуТекстура при рисовании. Если она найдена, мы устанавливаем для шейдера int «useMask» значение 1.
Достаточно просто, верно? Вот сцена, рисуемая с наложенной текстурой БЕЗ маски:
Без маски
И затем я установил в шейдере значения LightCoords:

Код: Выделить всё

    GLint lightCoordsLocation = glGetUniformLocation(m_programID, "lightCoords");
glUniform4f(lightCoordsLocation, 0, 0, 100, 100);
Затем я снова рисую сцену С маской, у меня получается следующее:
С маской
Я не понимаю, почему я получаю массив отверстий, хотя мне просто нужна 1 в указанном месте xy.
Я чувствую, что математические вычисления в шейдере неверны.
Если это помогает, это мое изображение:
Свет Отверстие
Также отлично работает изменение размера источника света, например:

Код: Выделить всё

    GLint lightCoordsLocation = glGetUniformLocation(m_programID, "lightCoords");
glUniform4f(lightCoordsLocation, 0, 0, 200, 100);
Делает это:
Эластичный свет
Поможете?
Я попробовал несколько разных способов выполнения математических вычислений в шейдере, чувствую, что здесь чего-то не хватает.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ng-shaders
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»