This commit is contained in:
Benau 2017-08-09 15:03:37 +08:00
parent 79c6705bb1
commit cc8331f5cd
5 changed files with 48 additions and 16 deletions

View File

@ -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);
}

View File

@ -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];
}

View File

@ -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();
}
// ----------------------------------------------------------------------------

View File

@ -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

View File

@ -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