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