У меня есть пустая текстура и легкая текстура, маску которых я создал, используя изображения и шейдер. Я могу визуализировать прозрачное изображение поверх окна и использовать градиентный круг, чтобы «пробить дыру» в нем, но мне нужно добавить больше «градиентных кругов» в разных местах. Я в тупике. Я включил весь код, который, по моему мнению, имеет отношение к решению моей проблемы. По сути, у меня есть текстура, отображаемая поверх игровой карты, я хотел бы создать массив «Lights», чтобы замаскировать альфа-значение наложенной текстуры, источники света будут содержать свои собственные переменные x/y/z/w.< /p>
основной файл:
#version 130
in vec2 vertexPosition;
in vec4 vertexColor;
in vec2 vertexUV;
out vec2 fragmentPosition;
out vec4 fragmentColor;
out vec2 fragmentUV;
uniform mat4 P;
void main() {
gl_Position.xy = (P * vec4(vertexPosition, 0.0, 1.0)).xy;
gl_Position.z = 0.0;
gl_Position.w = 1.0;
fragmentPosition = vertexPosition;
fragmentColor = vertexColor;
fragmentUV = vertexUV;
}
Результат: здесь происходит то, что текстура света передается в текстуру наложения в качестве маски, однако она соответствует координатам x/y/Width/Height наложения. сам. Он выполняет свою работу, маскируя альфа-дыру через наложенную текстуру.
Желаемый результат (Вроде того): я визуализирую наложение поверх двух индивидуально визуализированных световых текстур.
Я создал реальный желаемый доход с помощью редактора изображений, показывающего два источника света, проходящие через наложение, раскрывающее карта внизу. По сути, действует как система тумана войны.
Можно ли создать один идентификатор текстуры из двух источников света и передать его в качестве маски?
Все работает хорошо, я просто не знаю, как это применить с несколько изображений кругов и координаты, которые будут служить маской для прозрачного наложения.
У меня есть пустая текстура и легкая текстура, маску которых я создал, используя изображения и шейдер. Я могу визуализировать прозрачное изображение поверх окна и использовать градиентный круг, чтобы «пробить дыру» в нем, но мне нужно добавить больше «градиентных кругов» в разных местах. Я в тупике. Я включил весь код, который, по моему мнению, имеет отношение к решению моей проблемы. По сути, у меня есть текстура, отображаемая поверх игровой карты, я хотел бы создать массив «Lights», чтобы замаскировать альфа-значение наложенной текстуры, источники света будут содержать свои собственные переменные x/y/z/w.< /p> основной файл: [code]// Vec locations for the objects glm::vec4 bgBody(0.0f, 0.0f, 600.0f, 500.0f); glm::vec4 objectBody(20.0f, 20.0f, 100.0f, 100.0f); glm::vec4 overlay = bgBody; glm::vec4 light1(0.0f, 0.0f, 100.0f, 100.0f); glm::vec4 light2(200.0f, 150.0f, 100.0f, 100.0f);
// The Glyph class Glyph::Glyph(const glm::vec4& destRect, const glm::vec4& uvRect, GLuint Texture, float Depth, const ColorRGBA8& color , GLuint MaskTexture ) : texture(Texture), maskTexture(MaskTexture), depth(Depth) {
//This can be used instead to draw the overlay with the 2 lights under it where i want the light to come through //_glyphs.emplace_back(light1, UV, lightTexture.id, 0.0f, ColorRGBA8(0, 0, 0, 200)); // BG //_glyphs.emplace_back(light2, UV, lightTexture.id, 0.0f, ColorRGBA8(0, 0, 0, 200)); // BG //_glyphs.emplace_back(overlay, UV, blankTexture.id, 0.0f, ColorRGBA8(0, 0, 0, 200)); // BG
// Create variables. int offset = 0; // current offset int cv = 0; // current vertex // Number of vertices we are working with. int numVerts = 6;
//Add all the rest of the glyphs for (size_t cg = 1; cg < _glyphPointers.size(); cg++) { // Check if this glyph can be part of the current batch if ( (_glyphPointers[cg]->texture != _glyphPointers[cg - 1]->texture) || (_glyphPointers[cg]->maskTexture != _glyphPointers[cg - 1]->maskTexture) ) { // Make a new batch _renderBatches.emplace_back(offset, numVerts, _glyphPointers[cg]->texture, _glyphPointers[cg]->maskTexture); } else { // If its part of the current batch, just increase numVertices _renderBatches.back().numVertices += numVerts; } vertices[cv++] = _glyphPointers[cg]->topLeft; vertices[cv++] = _glyphPointers[cg]->bottomLeft; vertices[cv++] = _glyphPointers[cg]->bottomRight; vertices[cv++] = _glyphPointers[cg]->bottomRight; vertices[cv++] = _glyphPointers[cg]->topRight; vertices[cv++] = _glyphPointers[cg]->topLeft; offset += numVerts; }
fragmentUV = vertexUV; } [/code] Результат: здесь происходит то, что текстура света передается в текстуру наложения в качестве маски, однако она соответствует координатам x/y/Width/Height наложения. сам. Он выполняет свою работу, маскируя альфа-дыру через наложенную текстуру. [img]https://i.sstatic.net/mLXQaunD.png [/img]
Желаемый результат (Вроде того): я визуализирую наложение поверх двух индивидуально визуализированных световых текстур. [img]https://i.sstatic.net/AJ53sCS8.png[/img]
Я создал реальный желаемый доход с помощью редактора изображений, показывающего два источника света, проходящие через наложение, раскрывающее карта внизу. По сути, действует как система тумана войны. [img]https://i.sstatic.net/0pHatVCY.png[/img]
Можно ли создать один идентификатор текстуры из двух источников света и передать его в качестве маски? Все работает хорошо, я просто не знаю, как это применить с несколько изображений кругов и координаты, которые будут служить маской для прозрачного наложения.