Fix #2897
This commit is contained in:
parent
79c6705bb1
commit
cc8331f5cd
@ -1,10 +1,12 @@
|
||||
uniform sampler2D tex;
|
||||
|
||||
in vec2 uv;
|
||||
in vec4 vertex_color;
|
||||
out vec4 FragColor;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
vec4 color = texture(tex, uv);
|
||||
color *= vertex_color;
|
||||
FragColor = vec4(color.a * color.rgb, color.a);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
uniform mat4 ModelViewMatrix;
|
||||
uniform mat4 color_matrix;
|
||||
uniform vec3 Position;
|
||||
uniform vec2 Size;
|
||||
|
||||
@ -11,10 +11,12 @@ in vec2 Texcoord;
|
||||
#endif
|
||||
|
||||
out vec2 uv;
|
||||
out vec4 vertex_color;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
uv = Texcoord;
|
||||
vec4 Center = ModelViewMatrix * vec4(Position, 1.);
|
||||
vec4 Center = ViewMatrix * vec4(Position, 1.);
|
||||
gl_Position = ProjectionMatrix * (Center + vec4(Size * Corner, 0., 0.));
|
||||
vertex_color = color_matrix[gl_VertexID];
|
||||
}
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include "graphics/rtts.hpp"
|
||||
#include "graphics/shaders.hpp"
|
||||
#include "graphics/skybox.hpp"
|
||||
#include "graphics/stk_billboard.hpp"
|
||||
#include "graphics/stk_mesh_scene_node.hpp"
|
||||
#include "graphics/spherical_harmonics.hpp"
|
||||
#include "items/item_manager.hpp"
|
||||
@ -659,6 +660,7 @@ ShaderBasedRenderer::~ShaderBasedRenderer()
|
||||
delete m_skybox;
|
||||
delete m_rtts;
|
||||
ShaderFilesManager::kill();
|
||||
STKBillboard::destroyBillboardVAO();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@ -30,10 +30,10 @@
|
||||
using namespace irr;
|
||||
|
||||
|
||||
static GLuint billboardvao = 0;
|
||||
GLuint STKBillboard::m_billboard_vao = 0;
|
||||
|
||||
|
||||
class BillboardShader : public TextureShader<BillboardShader, 1, core::matrix4,
|
||||
class BillboardShader : public TextureShader<BillboardShader, 1,
|
||||
core::matrix4, core::vector3df,
|
||||
core::dimension2df>
|
||||
{
|
||||
@ -43,18 +43,16 @@ public:
|
||||
loadProgram(OBJECT, GL_VERTEX_SHADER, "billboard.vert",
|
||||
GL_FRAGMENT_SHADER, "billboard.frag");
|
||||
|
||||
assignUniforms("ModelViewMatrix", "ProjectionMatrix", "Position",
|
||||
"Size");
|
||||
assignUniforms("color_matrix", "Position", "Size");
|
||||
assignSamplerNames(0, "tex", ST_TRILINEAR_ANISOTROPIC_FILTERED);
|
||||
} // BillboardShader
|
||||
}; // BillboardShader
|
||||
|
||||
// ============================================================================
|
||||
|
||||
static void createBillboardVAO()
|
||||
void STKBillboard::createBillboardVAO()
|
||||
{
|
||||
glGenVertexArrays(1, &billboardvao);
|
||||
glBindVertexArray(billboardvao);
|
||||
glGenVertexArrays(1, &m_billboard_vao);
|
||||
glBindVertexArray(m_billboard_vao);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, SharedGPUObjects::getBillboardVBO());
|
||||
glEnableVertexAttribArray(0);
|
||||
glEnableVertexAttribArray(3);
|
||||
@ -64,6 +62,16 @@ static void createBillboardVAO()
|
||||
glBindVertexArray(0);
|
||||
} // createBillboardVAO
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
void STKBillboard::destroyBillboardVAO()
|
||||
{
|
||||
if (m_billboard_vao != 0)
|
||||
{
|
||||
glDeleteVertexArrays(1, &m_billboard_vao);
|
||||
m_billboard_vao = 0;
|
||||
}
|
||||
} // destroyBillboardVAO
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
STKBillboard::STKBillboard(irr::scene::ISceneNode* parent,
|
||||
irr::scene::ISceneManager* mgr, irr::s32 id,
|
||||
@ -75,7 +83,7 @@ STKBillboard::STKBillboard(irr::scene::ISceneNode* parent,
|
||||
CBillboardSceneNode(parent, mgr, id, position, size,
|
||||
colorTop, colorBottom)
|
||||
{
|
||||
if (!billboardvao)
|
||||
if (!m_billboard_vao)
|
||||
createBillboardVAO();
|
||||
} // STKBillboard
|
||||
|
||||
@ -97,9 +105,9 @@ void STKBillboard::render()
|
||||
return;
|
||||
|
||||
core::vector3df pos = getAbsolutePosition();
|
||||
glBindVertexArray(billboardvao);
|
||||
glBindVertexArray(m_billboard_vao);
|
||||
video::ITexture *tex = Material.getTexture(0);
|
||||
if (!tex )
|
||||
if (!tex)
|
||||
return;
|
||||
|
||||
::Material* material = material_manager->getMaterialFor(tex,
|
||||
@ -109,11 +117,24 @@ void STKBillboard::render()
|
||||
else
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
video::SColor col[2];
|
||||
getColor(col[0], col[1]);
|
||||
const float colors[] =
|
||||
{
|
||||
col[1].getRed() / 255.f, col[1].getGreen() / 255.f,
|
||||
col[1].getBlue() / 255.f, col[1].getAlpha() / 255.f,
|
||||
col[0].getRed() / 255.f, col[0].getGreen() / 255.f,
|
||||
col[0].getBlue() / 255.f, col[0].getAlpha() / 255.f,
|
||||
col[1].getRed() / 255.f, col[1].getGreen() / 255.f,
|
||||
col[1].getBlue() / 255.f, col[1].getAlpha() / 255.f,
|
||||
col[0].getRed() / 255.f, col[0].getGreen() / 255.f,
|
||||
col[0].getBlue() / 255.f, col[0].getAlpha() / 255.f,
|
||||
};
|
||||
core::matrix4 color_matrix;
|
||||
color_matrix.setM(colors);
|
||||
BillboardShader::getInstance()->use();
|
||||
BillboardShader::getInstance()->setTextureUnits(tex->getOpenGLTextureName());
|
||||
BillboardShader::getInstance()->setUniforms(irr_driver->getViewMatrix(),
|
||||
irr_driver->getProjMatrix(),
|
||||
pos, Size);
|
||||
BillboardShader::getInstance()->setUniforms(color_matrix, pos, Size);
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
glBindVertexArray(0);
|
||||
} // render
|
||||
|
@ -21,10 +21,14 @@
|
||||
#include "../lib/irrlicht/source/Irrlicht/CBillboardSceneNode.h"
|
||||
#include <IBillboardSceneNode.h>
|
||||
#include <irrTypes.h>
|
||||
#include "graphics/gl_headers.hpp"
|
||||
#include "utils/cpp2011.hpp"
|
||||
|
||||
class STKBillboard : public irr::scene::CBillboardSceneNode
|
||||
{
|
||||
private:
|
||||
static GLuint m_billboard_vao;
|
||||
static void createBillboardVAO();
|
||||
public:
|
||||
STKBillboard(irr::scene::ISceneNode* parent, irr::scene::ISceneManager* mgr,
|
||||
irr::s32 id, const irr::core::vector3df& position,
|
||||
@ -35,6 +39,7 @@ public:
|
||||
virtual void OnRegisterSceneNode() OVERRIDE;
|
||||
|
||||
virtual void render() OVERRIDE;
|
||||
static void destroyBillboardVAO();
|
||||
}; // STKBillboard
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user