Вот мой файл фрагмента:
Код: Выделить всё
#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
Код: Выделить всё
// 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);
}
Достаточно просто, верно? Вот сцена, рисуемая с наложенной текстурой БЕЗ маски:
Без маски
И затем я установил в шейдере значения 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
Мобильная версия