通过openGL画一个立方体

TrangleSample.h

//
// Created by ByteFlow on 2019/7/9.
//

#ifndef NDK_OPENGLES_3_0_TRIANGLESAMPLE_H
#define NDK_OPENGLES_3_0_TRIANGLESAMPLE_H


#include "GLSampleBase.h"
#include <detail/type_mat.hpp>
#include <detail/type_mat4x4.hpp>

class TriangleSample : public GLSampleBase
{
public:
	TriangleSample();
	virtual ~TriangleSample();

	virtual void LoadImage(NativeImage *pImage);

	virtual void Init();

	virtual void Draw(int screenW, int screenH);
	void UpdateMVPMatrix(glm::mat4 &mvpMatrix, int angleX, int angleY, float ratio);
	virtual void UpdateTransformMatrix(float rotateX, float rotateY, float scaleX, float scaleY);
	glm::mat4 buildRotateX(float rad);

	virtual void Destroy();
private:
	GLuint m_TextureId;
	GLint m_SamplerLoc;
	GLint vertexColorLocation;
	GLint m_MVPMatLoc;
    GLint m_TimeLoc;
	glm::mat4 m_MVPMatrix;
	NativeImage m_RenderImage;

	int m_AngleX;
	int m_AngleY;
	float m_ScaleX;
	float m_ScaleY;
};


#endif //NDK_OPENGLES_3_0_TRIANGLESAMPLE_H

TrangleSample.cpp

//
// Created by ByteFlow on 2019/7/9.
//

#include "TriangleSample.h"
#include "../util/GLUtils.h"
#include "../util/LogUtil.h"
#include <gtc/matrix_transform.hpp>


TriangleSample::TriangleSample()
{
	m_MVPMatLoc = GL_NONE;

	m_AngleX = 0;
	m_AngleY = 0;

	m_ScaleX = 1.0f;
	m_ScaleY = 1.0f;

}

TriangleSample::~TriangleSample()
{
}


void TriangleSample::LoadImage(NativeImage *pImage)
{
	//null implement

}

void TriangleSample::Init()
{
	if(m_ProgramObj != 0)
		return;
	char vShaderStr[] =
			"#version 300 es                          \n"
			"layout(location = 0) in vec3 vPosition;  \n"
			"layout(location = 1) in vec3 aColor;  \n"
			"uniform mat4 u_MVPMatrix;\n"
			//"uniform mat4 u_time;\n"
			"out vec4 vertexColor;  \n"
			"void main()                              \n"
			"{                                        \n"
			"   gl_Position =u_MVPMatrix *vec4(vPosition,1.0);              \n"
			"   vertexColor = vec4( aColor, 1.0);              \n"
			"}                                        \n";

	char fShaderStr[] =
			"#version 300 es                              \n"
			"precision mediump float;                     \n"
			"in vec4 vertexColor;                          \n"
			"uniform vec4 ourColor;                         \n"
			"out vec4 fragColor;                          \n"
			"void main()                                  \n"
			"{                                            \n"
			"   fragColor = vertexColor;  \n"
			"}                                            \n";

	m_ProgramObj = GLUtils::CreateProgram(vShaderStr, fShaderStr, m_VertexShader, m_FragmentShader);  //创建着色器程序
	if (m_ProgramObj)
	{
		vertexColorLocation = glGetUniformLocation(m_ProgramObj, "ourColor");  //获取一致变量在着色器程序中的位置序号 通过该序号设置一致变量的值
		m_MVPMatLoc = glGetUniformLocation(m_ProgramObj, "u_MVPMatrix");
		m_TimeLoc =  glGetUniformLocation(m_ProgramObj, "u_time");
	}

}

void TriangleSample::Draw(int screenW, int screenH)
{
	LOGCATE("TriangleSample::Draw");

	GLfloat vVertices[] = {
			// 位置              // 颜色
			/*1.0f, -1.0f, 0.0f,  1.0f, 0.0f, 0.0f,   // 右下
			-1.0f, -1.0f, 0.0f,  0.0f, 1.0f, 0.0f,   // 左下
            1.0f,  1.0f, 0.0f,  0.0f, 0.0f, 1.0f    // 顶部*/

           -0.5f, -0.5f, -0.5f,     0.0f,  1.0f, 0.0f,
            0.5f, -0.5f, -0.5f,     0.0f,  0.0f, 1.0f,
            0.5f,  0.5f, -0.5f,     1.0f,  0.0f, 0.0f,
            0.5f,  0.5f, -0.5f,     0.0f,  1.0f, 0.0f,
            -0.5f,  0.5f, -0.5f,    0.0f,  0.0f, 1.0f,
            -0.5f, -0.5f, -0.5f,    1.0f,  0.0f, 0.0f,

            -0.5f, -0.5f, 0.5f,     0.0f,  1.0f,  0.0f,
            0.5f, -0.5f, 0.5f,      0.0f,  0.0f,  1.0f,
            0.5f,  0.5f, 0.5f,      1.0f,  0.0f,  0.0f,
            0.5f,  0.5f, 0.5f,      0.0f,  1.0f,  0.0f,
            -0.5f,  0.5f, 0.5f,     0.0f,  0.0f,  1.0f,
            -0.5f, -0.5f, 0.5f,     1.0f,  0.0f,  0.0f,

            -0.5f,  0.5f,  0.5f,    0.0f,  0.0f,  1.0f,
            -0.5f,  0.5f, -0.5f,    0.0f,  1.0f,  0.0f,
            -0.5f, -0.5f, -0.5f,    1.0f,  0.0f,  0.0f,
            -0.5f, -0.5f, -0.5f,    0.0f,  0.0f,  1.0f,
            -0.5f, -0.5f,  0.5f,    0.0f,  1.0f,  0.0f,
            -0.5f,  0.5f,  0.5f,    1.0f,  0.0f,  0.0f,

            0.5f,  0.5f,  0.5f,    0.0f,  1.0f,  0.0f,
            0.5f,  0.5f, -0.5f,    0.0f,  0.0f,  1.0f,
            0.5f, -0.5f, -0.5f,    1.0f,  0.0f,  0.0f,
            0.5f, -0.5f, -0.5f,    0.0f,  1.0f,  0.0f,
            0.5f, -0.5f,  0.5f,    0.0f,  0.0f,  1.0f,
            0.5f,  0.5f,  0.5f,    1.0f,  0.0f,  0.0f,

            -0.5f, -0.5f, -0.5f,   1.0f, 0.0f,  0.0f,
            0.5f, -0.5f, -0.5f,    0.0f, 1.0f,  0.0f,
            0.5f, -0.5f,  0.5f,    0.0f, 0.0f,  1.0f,
            0.5f, -0.5f,  0.5f,    1.0f, 0.0f,  0.0f,
            -0.5f, -0.5f,  0.5f,   0.0f, 1.0f,  0.0f,
            -0.5f, -0.5f, -0.5f,   0.0f, 0.0f,  1.0f,

            -0.5f, 0.5f, -0.5f,    1.0f,  0.0f,  0.0f,
            0.5f, 0.5f, -0.5f,     0.0f,  1.0f,  0.0f,
            0.5f, 0.5f,  0.5f,     0.0f,  0.0f,  1.0f,
            0.5f, 0.5f,  0.5f,     1.0f,  0.0f,  0.0f,
            -0.5f, 0.5f,  0.5f,    0.0f,  1.0f,  0.0f,
            -0.5f, 0.5f, -0.5f,    0.0f,  0.0f,  1.0f,
	};

	if(m_ProgramObj == 0)
		return;

	glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除模板缓冲 颜色缓冲 深度缓冲
	glClearColor(1.0, 1.0, 1.0, 1.0); //用于设置背景色
   trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));
	glEnable(GL_DEPTH_TEST);
	float f = 0;
	f=9 + 1.0f;
	UpdateMVPMatrix(m_MVPMatrix, 60, 0, (float)40.0 / 80.0);
	// Use the program object
	glUseProgram (m_ProgramObj);   //激活着色器
	// Load the vertex data
	glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, vVertices ); //更新顶点格式
	glEnableVertexAttribArray (0); //启用指定属性 可在顶点着色器中访问逐顶点的属性数据(即允许着色器读取GPU数据)

	unsigned int VBO, VAO;
	glGenVertexArrays(1, &VAO);
	glGenBuffers(1, &VBO);
	// bind the Vertex Array Object first, then bind and set vertex buffer(s), and then configure vertex attributes(s).
	glBindVertexArray(VAO);

	glBindBuffer(GL_ARRAY_BUFFER, VBO);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vVertices), vVertices, GL_STATIC_DRAW);
	// 位置属性
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
	glEnableVertexAttribArray(0);
	// 颜色属性
	glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float)));
	glEnableVertexAttribArray(1);

	float greenValue = 1.0;
	glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);
	glUniformMatrix4fv(m_MVPMatLoc, 1, GL_FALSE, &m_MVPMatrix[0][0]);
	glm::mat4 Model = glm::mat4(1.0f);
	Model = glm::rotate(Model, static_cast<float>(fmod(GetSysCurrentTime(), 2000) / 2000), glm::vec3(0.0f, 0.0f, 1.0f)); //沿x轴旋转
	glUniformMatrix4fv(m_TimeLoc, 1, GL_FALSE, &Model[0][0]);
	//glDrawArrays (GL_TRIANGLES, 0, 3); //画三角形
    glDrawArrays(GL_TRIANGLES, 0, 36);

    /*float time = static_cast<float>(fmod(GetSysCurrentTime(), 2000) / 2000);
    LOGCATE("BeatingHeartSample::Draw() time=%f",time);
    glUniform1f(m_TimeLoc, time);*/
	glUseProgram (GL_NONE);

}

void TriangleSample::UpdateMVPMatrix(glm::mat4 &mvpMatrix, int angleX, int angleY, float ratio)
{
	LOGCATE("CoordSystemSample::UpdateMVPMatrix angleX = %d, angleY = %d, ratio = %f", angleX, angleY, ratio);
	angleX = angleX % 360;
	angleY = angleY % 360;

	//转化为弧度角
	float radiansX = static_cast<float>(MATH_PI / 180.0f * angleX);
	float radiansY = static_cast<float>(MATH_PI / 180.0f * angleY);


	// Projection matrix
	//glm::mat4 Projection = glm::ortho(-1.0f, 1.0f, -1.0f, 1.0f, 0.1f, 100.0f);
	//glm::mat4 Projection = glm::frustum(-ratio, ratio, -1.0f, 1.0f, 4.0f, 100.0f);
	glm::mat4 Projection = glm::perspective(45.0f,ratio, 0.1f,100.f);

	// View matrix
	glm::mat4 View = glm::lookAt(
			glm::vec3(-3, 0, 3), // Camera is at (0,0,1), in World Space
			glm::vec3(0, 0, 0), // and looks at the origin
			glm::vec3(0, 1, 0)  // Head is up (set to 0,-1,0 to look upside-down)
	);
	// Model matrix

	glm::mat4 Model = glm::mat4(1.0f);
	Model = glm::scale(Model, glm::vec3(m_ScaleX, m_ScaleX, m_ScaleX));
	Model = glm::rotate(Model, radiansX, glm::vec3(1.0f, 0.0f, 0.0f));
	Model = glm::rotate(Model, radiansY, glm::vec3(0.0f, 1.0f, 0.0f));
	Model = glm::translate(Model, glm::vec3(0.0f, 0.0f, 0.0f));

	mvpMatrix = Projection * View * Model;
}

void TriangleSample::UpdateTransformMatrix(float rotateX, float rotateY, float scaleX, float scaleY)
{
	GLSampleBase::UpdateTransformMatrix(rotateX, rotateY, scaleX, scaleY);
	m_AngleX = static_cast<int>(rotateX);
	m_AngleY = static_cast<int>(rotateY);
	m_ScaleX = scaleX;
	m_ScaleY = scaleY;
}
glm::mat4 TriangleSample::buildRotateX(float rad)
{
    glm::mat4 xrot = glm::mat4(1.0, 0.0, 0.0, 0.0,
                               0.0, cos(rad), -sin(rad), 0.0,
                               0.0, sin(rad), cos(rad), 0.0,
                               0.0, 0.0, 0.0, 1.0);
    return xrot;
}
void TriangleSample::Destroy()
{
	if (m_ProgramObj)
	{
		glDeleteProgram(m_ProgramObj);
		m_ProgramObj = GL_NONE;
	}

}

结果:
在这里插入图片描述
代码2:创建一个光照场景下的立方体代码:
TrangleSample.h

//
// Created by ByteFlow on 2019/7/9.
//

#ifndef NDK_OPENGLES_3_0_TRIANGLESAMPLE_H
#define NDK_OPENGLES_3_0_TRIANGLESAMPLE_H


#include "GLSampleBase.h"
#include <detail/type_mat.hpp>
#include <detail/type_mat4x4.hpp>

class TriangleSample : public GLSampleBase
{
public:
	TriangleSample();
	virtual ~TriangleSample();

	virtual void LoadImage(NativeImage *pImage);

	virtual void Init();

	virtual void Draw(int screenW, int screenH);
	void UpdateMVPMatrix(glm::mat4 &mvpMatrix, int angleX, int angleY, float ratio);
	virtual void UpdateTransformMatrix(float rotateX, float rotateY, float scaleX, float scaleY);
	glm::mat4 buildRotateX(float rad);

	virtual void Destroy();
private:
	GLuint m_TextureId;
	GLint m_SamplerLoc;
	GLint vertexObjectcolor;
    GLint vertexLightColor;
	GLint m_MVPMatLoc;
    GLint m_TimeLoc;
	glm::mat4 m_MVPMatrix;
	NativeImage m_RenderImage;

	int m_AngleX;
	int m_AngleY;
	float m_ScaleX;
	float m_ScaleY;
};


#endif //NDK_OPENGLES_3_0_TRIANGLESAMPLE_H

TrangleSample.cpp

//
// Created by ByteFlow on 2019/7/9.
//

#include "TriangleSample.h"
#include "../util/GLUtils.h"
#include "../util/LogUtil.h"
#include <gtc/matrix_transform.hpp>


TriangleSample::TriangleSample()
{
	m_MVPMatLoc = GL_NONE;

	m_AngleX = 0;
	m_AngleY = 0;

	m_ScaleX = 1.0f;
	m_ScaleY = 1.0f;

}

TriangleSample::~TriangleSample()
{
}


void TriangleSample::LoadImage(NativeImage *pImage)
{
	//null implement

}

void TriangleSample::Init()
{
	if(m_ProgramObj != 0)
		return;
	char vShaderStr[] =
			"#version 300 es                          \n"
			"layout(location = 0) in vec3 vPosition;  \n"
			"layout(location = 1) in vec3 aColor;  \n"
			"uniform mat4 u_MVPMatrix;\n"
			"void main()                              \n"
			"{                                        \n"
			"   gl_Position =u_MVPMatrix *vec4(vPosition,1.0);              \n"
			"}                                        \n";

	char fShaderStr[] =
			"#version 300 es                              \n"
			"precision mediump float;                     \n"
            "uniform vec3 objectcolor;                         \n"  //被照物体颜色
			"uniform vec3 lightColor;                         \n"   //灯的颜色
			"out vec4 fragColor;                          \n"
			"void main()                                  \n"
			"{                                            \n"
			"   fragColor = vec4(lightColor*objectcolor,1.0);  \n"  //创建一个光照场景(创建了表示灯和被照物体立方体)
			"}                                            \n";

	m_ProgramObj = GLUtils::CreateProgram(vShaderStr, fShaderStr, m_VertexShader, m_FragmentShader);  //创建着色器程序
	if (m_ProgramObj)
	{
        vertexObjectcolor = glGetUniformLocation(m_ProgramObj, "objectcolor");  //获取一致变量在着色器程序中的位置序号 通过该序号设置一致变量的值
        vertexLightColor = glGetUniformLocation(m_ProgramObj, "lightColor");
		m_MVPMatLoc = glGetUniformLocation(m_ProgramObj, "u_MVPMatrix");
	}

}

void TriangleSample::Draw(int screenW, int screenH)
{
	LOGCATE("TriangleSample::Draw");

	GLfloat vVertices[] = {
			// 位置              // 颜色
			/*1.0f, -1.0f, 0.0f,  1.0f, 0.0f, 0.0f,   // 右下
			-1.0f, -1.0f, 0.0f,  0.0f, 1.0f, 0.0f,   // 左下
            1.0f,  1.0f, 0.0f,  0.0f, 0.0f, 1.0f    // 顶部*/

           -0.5f, -0.5f, -0.5f,     0.0f,  1.0f, 0.0f,
            0.5f, -0.5f, -0.5f,     0.0f,  0.0f, 1.0f,
            0.5f,  0.5f, -0.5f,     1.0f,  0.0f, 0.0f,
            0.5f,  0.5f, -0.5f,     0.0f,  1.0f, 0.0f,
            -0.5f,  0.5f, -0.5f,    0.0f,  0.0f, 1.0f,
            -0.5f, -0.5f, -0.5f,    1.0f,  0.0f, 0.0f,

            -0.5f, -0.5f, 0.5f,     0.0f,  1.0f,  0.0f,
            0.5f, -0.5f, 0.5f,      0.0f,  0.0f,  1.0f,
            0.5f,  0.5f, 0.5f,      1.0f,  0.0f,  0.0f,
            0.5f,  0.5f, 0.5f,      0.0f,  1.0f,  0.0f,
            -0.5f,  0.5f, 0.5f,     0.0f,  0.0f,  1.0f,
            -0.5f, -0.5f, 0.5f,     1.0f,  0.0f,  0.0f,

            -0.5f,  0.5f,  0.5f,    0.0f,  0.0f,  1.0f,
            -0.5f,  0.5f, -0.5f,    0.0f,  1.0f,  0.0f,
            -0.5f, -0.5f, -0.5f,    1.0f,  0.0f,  0.0f,
            -0.5f, -0.5f, -0.5f,    0.0f,  0.0f,  1.0f,
            -0.5f, -0.5f,  0.5f,    0.0f,  1.0f,  0.0f,
            -0.5f,  0.5f,  0.5f,    1.0f,  0.0f,  0.0f,

            0.5f,  0.5f,  0.5f,    0.0f,  1.0f,  0.0f,
            0.5f,  0.5f, -0.5f,    0.0f,  0.0f,  1.0f,
            0.5f, -0.5f, -0.5f,    1.0f,  0.0f,  0.0f,
            0.5f, -0.5f, -0.5f,    0.0f,  1.0f,  0.0f,
            0.5f, -0.5f,  0.5f,    0.0f,  0.0f,  1.0f,
            0.5f,  0.5f,  0.5f,    1.0f,  0.0f,  0.0f,

            -0.5f, -0.5f, -0.5f,   1.0f, 0.0f,  0.0f,
            0.5f, -0.5f, -0.5f,    0.0f, 1.0f,  0.0f,
            0.5f, -0.5f,  0.5f,    0.0f, 0.0f,  1.0f,
            0.5f, -0.5f,  0.5f,    1.0f, 0.0f,  0.0f,
            -0.5f, -0.5f,  0.5f,   0.0f, 1.0f,  0.0f,
            -0.5f, -0.5f, -0.5f,   0.0f, 0.0f,  1.0f,

            -0.5f, 0.5f, -0.5f,    1.0f,  0.0f,  0.0f,
            0.5f, 0.5f, -0.5f,     0.0f,  1.0f,  0.0f,
            0.5f, 0.5f,  0.5f,     0.0f,  0.0f,  1.0f,
            0.5f, 0.5f,  0.5f,     1.0f,  0.0f,  0.0f,
            -0.5f, 0.5f,  0.5f,    0.0f,  1.0f,  0.0f,
            -0.5f, 0.5f, -0.5f,    0.0f,  0.0f,  1.0f,
	};

	if(m_ProgramObj == 0)
		return;

	glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除模板缓冲 颜色缓冲 深度缓冲
	glClearColor(1.0, 1.0, 1.0, 1.0); //用于设置背景色
   trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));
	glEnable(GL_DEPTH_TEST);
	float f = 0;
	f=9 + 1.0f;
	UpdateMVPMatrix(m_MVPMatrix, 60, 0, (float)40.0 / 80.0);
	// Use the program object
	glUseProgram (m_ProgramObj);   //激活着色器
	// Load the vertex data
	glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, vVertices ); //更新顶点格式
	glEnableVertexAttribArray (0); //启用指定属性 可在顶点着色器中访问逐顶点的属性数据(即允许着色器读取GPU数据)

	unsigned int VBO, VAO;
	glGenVertexArrays(1, &VAO);
	glGenBuffers(1, &VBO);
	// bind the Vertex Array Object first, then bind and set vertex buffer(s), and then configure vertex attributes(s).
	glBindVertexArray(VAO);

	glBindBuffer(GL_ARRAY_BUFFER, VBO);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vVertices), vVertices, GL_STATIC_DRAW);
	// 位置属性
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
	glEnableVertexAttribArray(0);
	// 颜色属性
	glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float)));
	glEnableVertexAttribArray(1);

	glUniform3f(vertexObjectcolor, 1.0f, 0.5, 0.31f);
	glUniform3f(vertexLightColor, 0.0f, 1.0, 0.0f);
	//lightingShader.use();
	//lightingShader.setVec3("objectColor", 1.0f, 0.5f, 0.31f);
	//lightingShader.setVec3("lightColor",  1.0f, 1.0f, 1.0f);
	glUniformMatrix4fv(m_MVPMatLoc, 1, GL_FALSE, &m_MVPMatrix[0][0]);
	glm::mat4 Model = glm::mat4(1.0f);
	Model = glm::rotate(Model, static_cast<float>(fmod(GetSysCurrentTime(), 2000) / 2000), glm::vec3(0.0f, 0.0f, 1.0f)); //沿x轴旋转
	glUniformMatrix4fv(m_TimeLoc, 1, GL_FALSE, &Model[0][0]);
	//glDrawArrays (GL_TRIANGLES, 0, 3); //画三角形
    glDrawArrays(GL_TRIANGLES, 0, 36);

    /*float time = static_cast<float>(fmod(GetSysCurrentTime(), 2000) / 2000);
    LOGCATE("BeatingHeartSample::Draw() time=%f",time);
    glUniform1f(m_TimeLoc, time);*/
	glUseProgram (GL_NONE);

}

void TriangleSample::UpdateMVPMatrix(glm::mat4 &mvpMatrix, int angleX, int angleY, float ratio)
{
	LOGCATE("CoordSystemSample::UpdateMVPMatrix angleX = %d, angleY = %d, ratio = %f", angleX, angleY, ratio);
	angleX = angleX % 360;
	angleY = angleY % 360;

	//转化为弧度角
	float radiansX = static_cast<float>(MATH_PI / 180.0f * angleX);
	float radiansY = static_cast<float>(MATH_PI / 180.0f * angleY);


	// Projection matrix
	//glm::mat4 Projection = glm::ortho(-1.0f, 1.0f, -1.0f, 1.0f, 0.1f, 100.0f);
	//glm::mat4 Projection = glm::frustum(-ratio, ratio, -1.0f, 1.0f, 4.0f, 100.0f);
	glm::mat4 Projection = glm::perspective(45.0f,ratio, 0.1f,100.f);

	// View matrix
	glm::mat4 View = glm::lookAt(
			glm::vec3(-3, 0, 3), // Camera is at (0,0,1), in World Space
			glm::vec3(0, 0, 0), // and looks at the origin
			glm::vec3(0, 1, 0)  // Head is up (set to 0,-1,0 to look upside-down)
	);
	// Model matrix

	glm::mat4 Model = glm::mat4(1.0f);
	Model = glm::scale(Model, glm::vec3(m_ScaleX, m_ScaleX, m_ScaleX));
	Model = glm::rotate(Model, radiansX, glm::vec3(1.0f, 0.0f, 0.0f));
	Model = glm::rotate(Model, radiansY, glm::vec3(0.0f, 1.0f, 0.0f));
	Model = glm::translate(Model, glm::vec3(0.0f, 0.0f, 0.0f));

	mvpMatrix = Projection * View * Model;
}

void TriangleSample::UpdateTransformMatrix(float rotateX, float rotateY, float scaleX, float scaleY)
{
	GLSampleBase::UpdateTransformMatrix(rotateX, rotateY, scaleX, scaleY);
	m_AngleX = static_cast<int>(rotateX);
	m_AngleY = static_cast<int>(rotateY);
	m_ScaleX = scaleX;
	m_ScaleY = scaleY;
}
glm::mat4 TriangleSample::buildRotateX(float rad)
{
    glm::mat4 xrot = glm::mat4(1.0, 0.0, 0.0, 0.0,
                               0.0, cos(rad), -sin(rad), 0.0,
                               0.0, sin(rad), cos(rad), 0.0,
                               0.0, 0.0, 0.0, 1.0);
    return xrot;
}
void TriangleSample::Destroy()
{
	if (m_ProgramObj)
	{
		glDeleteProgram(m_ProgramObj);
		m_ProgramObj = GL_NONE;
	}

}