#include "SampleApplication.h"
#include "texture_utils.h"
#include "util/shader_utils.h"
class SimpleTexture2DSample : public SampleApplication
{
public:
SimpleTexture2DSample(int argc, char **argv) : SampleApplication("SimpleTexture2D", argc, argv)
{}
bool initialize() override
{
constexpr char kVS[] = R"(attribute vec4 a_position;
attribute vec2 a_texCoord;
varying vec2 v_texCoord;
void main()
{
gl_Position = a_position;
v_texCoord = a_texCoord;
})";
constexpr char kFS[] = R"(precision mediump float;
varying vec2 v_texCoord;
uniform sampler2D s_texture;
void main()
{
gl_FragColor = texture2D(s_texture, v_texCoord);
})";
mProgram = CompileProgram(kVS, kFS);
if (!mProgram)
{
return false;
}
mPositionLoc = glGetAttribLocation(mProgram, "a_position");
mTexCoordLoc = glGetAttribLocation(mProgram, "a_texCoord");
mSamplerLoc = glGetUniformLocation(mProgram, "s_texture");
mTexture = CreateSimpleTexture2D();
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
return true;
}
void destroy() override
{
glDeleteProgram(mProgram);
glDeleteTextures(1, &mTexture);
}
void draw() override
{
GLfloat vertices[] = {
-0.5f, 0.5f, 0.0f,
0.0f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.0f, 1.0f,
0.5f, -0.5f, 0.0f,
1.0f, 1.0f,
0.5f, 0.5f, 0.0f,
1.0f, 0.0f
};
GLushort indices[] = {0, 1, 2, 0, 2, 3};
glViewport(0, 0, getWindow()->getWidth(), getWindow()->getHeight());
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(mProgram);
glVertexAttribPointer(mPositionLoc, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), vertices);
glVertexAttribPointer(mTexCoordLoc, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat),
vertices + 3);
glEnableVertexAttribArray(mPositionLoc);
glEnableVertexAttribArray(mTexCoordLoc);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, mTexture);
glUniform1i(mSamplerLoc, 0);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
}
private:
GLuint mProgram;
GLint mPositionLoc;
GLint mTexCoordLoc;
GLint mSamplerLoc;
GLuint mTexture;
};
int main(int argc, char **argv)
{
SimpleTexture2DSample app(argc, argv);
return app.run();
}