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

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include #include "stdafx.h" #define GLUT_DISABLE_ATEXIT_HACK #include //#pragma comment(lib, "glut32.lib") GLfloat AngleX;//旋转向量 GLfloat AngleY; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); //这个函数其实就是对接下来要做什么进行一下声明 GL_MODELVIEW 模型视图 glLoadIdentity(); glPushMatrix();// 提供了相应的接口 { glRotatef(AngleX, 1.0f, 0.0f, 0.0f); glRotatef(AngleY, 0.0f, 1.0f, 0.0f); glBegin(GL_POLYGON); //前表面 glColor3f(1.0f,1.0f,1.0f);//颜色设置为白色 glVertex3f(50.0f, 50.0f, 50.0f); glColor3f(1.0f,1.0f,0.0f);//颜色设置为黄色 glVertex3f(50.0f, -50.0f, 50.0f); glColor3f(1.0f,0.0f,0.0f);//颜色设置为红色 glVertex3f(-50.0f, -50.0f, 50.0f); glColor3f(1.0f,0.0f,1.0f);//颜色设置为品红色 glVertex3f(-50.0f, 50.0f, 50.0f); glEnd(); glBegin(GL_POLYGON); //后表面 glColor3f(0.0f, 1.0f, 1.0f);//颜色设置为青色 glVertex3f(50.0f, 50.0f, -50.0f); glColor3f(0.0f, 1.0f, 0.0f);//颜色设置为绿色 glVertex3f(50.0f, -50.0f, -50.0f); glColor3f(0.0f, 0.0f, 0.0f);//颜色设置为黑色 glVertex3f(-50.0f, -50.0f, -50.0f); glColor3f(0.0f, 0.0f, 1.0f);//颜色设置为蓝色 glVertex3f(-50.0f, 50.0f, -50.0f); glEnd(); glBegin(GL_POLYGON); //右表面 glColor3ub((GLubyte)255, (GLubyte)255, (GLubyte)255);//颜色设置为白色 glVertex3f(50.0f, 50.0f, 50.0f); glColor3f(0.0f, 1.0f, 1.0f);//颜色设置为青色 glVertex3f(50.0f, 50.0f, -50.0f); glColor3f(0.0f, 1.0f, 0.0f);//颜色设置为绿色 glVertex3f(50.0f, -50.0f, -50.0f); glColor3ub((GLubyte)255, (GLubyte)255, (GLubyte)0);//颜色设置为黄色 glVertex3f(50.0f, -50.0f, 50.0f); glEnd(); glBegin(GL_POLYGON); //左表面 glColor3d(0.0, 0.0, 1.0);//颜色设置为蓝色 glVertex3f(-50.0f, 50.0f, -50.0f); glColor3f(0.0f, 0.0f, 0.0f);//颜色设置为黑色 glVertex3f(-50.0f, -50.0f, -50.0f); glColor3ub((GLubyte)255, (GLubyte)0, (GLubyte)0);//颜色设置为红色 glVertex3f(-50.0f, -50.0f, 50.0f); glColor3f(1.0f, 0.0f, 1.0f);//颜色设置为品红色 glVertex3f(-50.0f, 50.0f, 50.0f); glEnd(); glBegin(GL_POLYGON); //上表面 glColor3d(0.0, 1.0, 1.0);//颜色设置为青色 glVertex3f(50.0f, 50.0f, -50.0f); glColor3d(1.0, 1.0, 1.0);//颜色设置为白色 glVertex3f(50.0f, 50.0f, 50.0f); glColor3d(1.0, 0.0, 1.0);//颜色设置为品红色 glVertex3f(-50.0f, 50.0f, 50.0f); glColor3d(0.0, 0.0, 1.0);//颜色设置为蓝色 glVertex3f(-50.0f, 50.0f, -50.0f); glEnd(); glBegin(GL_POLYGON); //下表面 glColor3f(0.0f, 1.0f, 0.0f);//颜色设置为绿色 glVertex3f(50.0f, -50.0f, -50.0f); glColor3ub((GLubyte)255, (GLubyte)255, (GLubyte)0);//颜色设置为黄色 glVertex3f(50.0f, -50.0f, 50.0f); glColor3f(1.0f, 0.0f, 0.0f);//颜色设置为红色 glVertex3f(-50.0f, -50.0f, 50.0f); glColor3f(0.0f, 0.0f, 0.0f);//颜色设置为黑色 glVertex3f(-50.0f, -50.0f, -50.0f); glEnd(); } glPopMatrix(); glutSwapBuffers(); } void reshape(int w, int h) { GLfloat aspect = (GLfloat)w / (GLfloat)h; GLfloat nRange = 100.0f; glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影模式 glLoadIdentity(); //设置三维投影区 if (w 355.0f) { AngleX = 0.0f; } if (AngleX 355.0f) AngleY = 0.0f; if (AngleY < 0.0f) { AngleY = 355.0f; } glutPostRedisplay(); } void init() { AngleX = 45.0f; AngleY = 315.0f; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glEnable(GL_DEPTH_TEST); //初始化OpenGL glEnable(GL_DITHER); //抖动是激活的。 glShadeModel(GL_SMOOTH);//两点间颜色有过渡效果 } void main(int argc, char* argv[]) { glutInit(&argc;, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); //使用双缓存 使用深度缓存。 glutInitWindowSize(480, 480); glutCreateWindow("OpenGL颜色立方体"); glutReshapeFunc(reshape); //窗口改变的时候调用的函数 glutDisplayFunc(display); glutSpecialFunc(key_board); //函数注册鼠标响应事件 init(); glutMainLoop(); }
以下是使用 OpenGL 立方体的基本步骤: 1. 首先,您需要设置 OpenGL 的视口和投影矩阵以确定立方体的位置和大小。 2. 接下来,您需要定义立方体的顶点和面。一个立方体有六个面,每个面由两个三角形组成。每个三角形都由三个顶点定义。 3. 接下来,您需要将这些顶点和面传递给 OpenGL,并设置正确的顶点属性和缓冲区对象。 4. 在设置完所有必要的属性后,您可以使用 glDrawElements 或 glDrawArrays 命令来渲染立方体。 下面是一个简单的 OpenGL 程序,用于一个红色的立方体: ```c++ #include <GL/glut.h> GLfloat vertices[] = {-1.0,-1.0,-1.0,1.0,-1.0,-1.0,1.0,1.0,-1.0,-1.0,1.0,-1.0,-1.0,-1.0,1.0,1.0,-1.0,1.0,1.0,-1.0,-1.0,1.0,-1.0,1.0,1.0,1.0,1.0,1.0,-1.0,1.0,-1.0,-1.0,-1.0,-1.0,-1.0,1.0,-1.0,-1.0,1.0,1.0,-1.0,-1.0,1.0,-1.0,1.0,1.0,1.0,1.0,-1.0,1.0,-1.0}; GLfloat colors[] = {1.0,0.0,0.0,1.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,1.0,1.0,0.0,1.0,0.0,1.0,0.0,1.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0}; GLubyte indices[] = {0,3,2,1,2,3,7,6,0,4,5,6,1,5,4,0,2,6,5,1,7,3,4,7}; void drawCube(void) { glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glVertexPointer(3, GL_FLOAT, 0, vertices); glColorPointer(3, GL_FLOAT, 0, colors); glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, indices); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); gluLookAt(5,5,5,0,0,0,0,1,0); drawCube(); glFlush(); } void reshape(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60, (GLfloat)w / (GLfloat)h, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); glClearColor(0.0, 0.0, 0.0, 0.0); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; } ``` 这个程序创建一个立方体,并使用红色进行着色。它还设置了视口和投影矩阵,使立方体在屏幕上居中并具有透视效果。您可以通过更改顶点数组和颜色数组来更改立方体的外观。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值