/src/DecalShader.cpp
#include "DecalShader.h"
#include <GLES2/gl2.h>
#include "Texture.h"
DecalShader::DecalShader(void) {
vertexShader = compileShader(
"uniform mat4 Projection;\n"
"uniform mat4 Transform;\n"
"uniform sampler2D Texture;\n"
"uniform ivec2 TextureSize;\n"
"uniform ivec2 TextureOffset;\n"
"attribute vec2 Position;\n"
"varying mediump vec2 TexturePosition;\n"
"void main() {\n"
" gl_Position = Projection * Transform * vec4(Position, 0.0, 1.0);\n"
" TexturePosition = Position + vec2(TextureOffset);\n"
" TexturePosition.x = TexturePosition.x / float(TextureSize.x);\n"
" TexturePosition.y = TexturePosition.y / float(TextureSize.y);\n"
"}",
GL_VERTEX_SHADER
);
fragmentShader = compileShader(
"uniform sampler2D Texture;\n"
"varying mediump vec2 TexturePosition;\n"
"void main() {\n"
" gl_FragColor = texture2D(Texture, TexturePosition);\n"
"}",
GL_FRAGMENT_SHADER
);
linkProgram();
glUseProgram(shaderProgram);
basicInit();
uTexture = glGetUniformLocation(shaderProgram, "Texture");
uTextureSize = glGetUniformLocation(shaderProgram, "TextureSize");
uTextureOffset = glGetUniformLocation(shaderProgram, "TextureOffset");
setTextureOffset(0, 0);
}
DecalShader::~DecalShader(void) {
}
void DecalShader::setTexture(Texture* texture) {
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture->getTextureUnit());
glUniform1i(this->uTexture, 0);
glUniform2i(this->uTextureSize, texture->getWidth(), texture->getHeight());
}
void DecalShader::setTextureOffset(int x, int y) {
glUniform2i(uTextureOffset, x, y);
}