Basic environment : VS2017
Configuration : freeglut-3.2.1 GLEW
首先添加math_3d.h的头文件,并添加代码
#pragma once
#ifndef MATH_3D_H
#define MATH_3D_H
#include <stdio.h>
#include <math.h>
#define ToRadian(x) ((x) * M_PI / 180.0f)
#define ToDegree(x) ((x) * 180.0f / M_PI)
struct Vector2i
{
int x;
int y;
};
struct Vector2f
{
float x;
float y;
Vector2f()
{
}
Vector2f(float _x, float _y)
{
x = _x;
y = _y;
}
};
struct Vector3f
{
float x;
float y;
float z;
Vector3f()
{
}
Vector3f(float _x, float _y, float _z)
{
x = _x;
y = _y;
z = _z;
}
Vector3f& operator+=(const Vector3f& r)
{
x += r.x;
y += r.y;
z += r.z;
return *this;
}
Vector3f& operator-=(const Vector3f& r)
{
x -= r.x;
y -= r.y;
z -= r.z;
return *this;
}
Vector3f& operator*=(float f)
{
x *= f;
y *= f;
z *= f;
return *this;
}
Vector3f Cross(const Vector3f& v) const;
Vector3f& Normalize();
void Rotate(float Angle, const Vector3f& Axis);
void Print() const
{
printf("(%.02f, %.02f, %.02f", x, y, z);
}
};
inline Vector3f operator+(const Vector3f& l, const Vector3f& r)
{
Vector3f Ret(l.x + r.x,
l.y + r.y,
l.z + r.z);
return Ret;
}
inline Vector3f operator-(const Vector3f& l, const Vector3f& r)
{
Vector3f Ret(l.x - r.x,
l.y - r.y,
l.z - r.z);
return Ret;
}
inline Vector3f operator*(const Vector3f& l, float f)
{
Vector3f Ret(l.x * f,
l.y * f,
l.z * f);
return Ret;
}
class Matrix4f
{
public:
float m[4][4];
Matrix4f()
{
}
inline void InitIdentity()
{
m[0][0] = 1.0f; m[0][1] = 0.0f; m[0][2] = 0.0f; m[0][3] = 0.0f;
m[1][0] = 0.0f; m[1][1] = 1.0f; m[1][2] = 0.0f; m[1][3] = 0.0f;
m[2][0] = 0.0f; m[2][1] = 0.0f; m[2][2] = 1.0f; m[2][3] = 0.0f;
m[3][0] = 0.0f; m[3][1] = 0.0f; m[3][2] = 0.0f; m[3][3] = 1.0f;
}
inline Matrix4f operator*(const Matrix4f& Right) const
{
Matrix4f Ret;
for (unsigned int i = 0; i < 4; i++) {
for (unsigned int j = 0; j < 4; j++) {
Ret.m[i][j] = m[i][0] * Right.m[0][j] +
m[i][1] * Right.m[1][j] +
m[i][2] * Right.m[2][j] +
m[i][3] * Right.m[3][j];
}
}
return Ret;
}
void InitScaleTransform(float ScaleX, float ScaleY, float ScaleZ);
void InitRotateTransform(float RotateX, float RotateY, float RotateZ);
void InitTranslationTransform(float x, float y, float z);
void InitCameraTransform(const Vector3f& Target, const Vector3f& Up);
void InitPersProjTransform(float FOV, float Width, float Height, float zNear, float zFar);
};
struct Quaternion
{
float x, y, z, w;
Quaternion(float _x, float _y, float _z, float _w);
void Normalize();
Quaternion Conjugate();
};
Quaternion operator*(const Quaternion& l, const Quaternion& r);
Quaternion operator*(const Quaternion& q, const Vector3f& v);
#endif /* MATH_3D_H */
接下来是主函数的内容
#include <stdio.h>
#include <GL/glew.h>
#include <GL/freeglut.h>
#include "math_3d.h"
GLuint VBO;
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
/*打开顶点属性的缓冲
*/
glEnableVertexAttribArray(0);
/*再一次绑定顶点缓冲*/
glBindBuffer(GL_ARRAY_BUFFER, VBO);
/*
这个函数告诉管线,怎么解释顶点缓冲中的数据。
第一个参数指定属性的索引,第二个参数是属性的数量(3,表示,x,y,z),第三个参数是属性的数据类型,
第四个参数是属性是否是归一化的,第五个参数是stride,表示属性的字节数目,
*/
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
//这个函数是看你想画的内容,这里是画三角形,第三个参数是你有几个顶点
glDrawArrays(GL_POINTS, 0, 1);
/*关闭顶点属性,防止未知的错误*/
glDisableVertexAttribArray(0);
glutSwapBuffers();
}
void createVertex()
{
Vector3f Vertices[1];
Vertices[0] = Vector3f(0.0f, 0.0f, 0.0f);
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(400, 400);
glutInitWindowPosition(100, 100);
glutCreateWindow("117");
glutDisplayFunc(&myDisplay);
// Must be done after glut is initialized!
GLenum res = glewInit();
if (res != GLEW_OK)
{
fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));
return 1;
}
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
createVertex();
glutMainLoop();
return 0;
}