#include <iostream>
#include<glew.h>
#include<freeglut.h>
#include<gl.h>
#pragma comment(lib,"glew32.lib")
#pragma comment(lib,"freeglut.lib")
#pragma comment(lib,"glut32.lib")
//#pragma comment(lib,"opengl.lib")
/*/#define BUFFER_OFFSET(offset)((GLint *)NULL+offset)用这一个会变成奇怪的颜色*/
#define BUFFER_OFFSET(bytes)((GLvoid *)(bytes))/*/这个是在书上的,这种竟然没有在附录的代码里面*/
const int NumTimesToSubdivide = 5;/*/这里是递归的次数*/
const int NumTetrahedrons = 1024; /*4^5 tetrahedrons;根据上面递归五次,所以就是4的五次方个四面体*/
const int NumTriangles = 4 * NumTetrahedrons; /*/ 4 triangles / tetrahedron每个四面体有4各面*/
const int NumVertices = 3 * NumTriangles; /*/ 3 vertices / triangle 每个面有3个顶点*/
/*@注释 *这个看书上说是在vec.h的头文件里面,可是我电脑上没有,
*我只知道,书上是说vec是甚么向量,
*vec2是连续两个float,
*vec3是连续三个float,
*vec4是连续四个float,
*我尝试自己弄这个结构体,并有构造函数初始化。
*/
struct vec3
{
GLfloat x, y, z;
vec3(){}
vec3(GLfloat hong, GLfloat lv, GLfloat lan)
:x(hong), y(lv), z(lan) {}
vec3 operator +(vec3 other)const
{
vec3 temp(x + other.x,y + other.y,z + other.z);
return temp;
}
vec3 operator/(GLint t)
{
vec3 temp(x/t, y/t, z/t);
return temp;
}
};
typedef ::vec3 point3;
typedef ::vec3 color3;/*书上说甚么opengl习惯性这样,对于我来说,觉得这样很啰嗦,明明都是同一个类型*/
point3 points[NumVertices];
color3 YanSe[NumVertices];
color3 vertex_Yase[4] =
{
color3(0.6f, 0.7f, 0.0f),
color3(0.0f, 1.0f, 0.0f),
color3(0.0f, 0.5f, 0.2f),
color3(0.4f, 0.0f, 0.0f)
/*四面体有四个三角面,所以就设置了四种颜色*/
};
int Index = 0;
//----------------------------------------------------------------------------
int colorIndex;
/*@注释*对于由a、b、c确定的一个三角面,三个点设置同一个颜色才会是纯色的,否则是渐变的代码
*/
void
triangle(const vec3& a, const vec3& b, const vec3& c)
{
YanSe[Index] = vertex_Yase[colorIndex];
points[Index++] = a;
YanSe[Index] = vertex_Yase[colorIndex];
points[Index++] = b;
YanSe[Index] = vertex_Yase[colorIndex];
points[Index++] = c;
/*@注释*下面是渐变代码
YanSe[Index] = vertex_Yase[0];
points[Index++] = a;
YanSe[Index] = vertex_Yase[1];
points[Index++] = b;
YanSe[Index] = vertex_Yase[2];
points[Index++] = c;
*/
}
//----------------------------------------------------------------------------
/*@说明*下面的colorIndex用于给
*最终的每一个四面体的
*四个三角面triangle涂上不同的纯色,
*如果要用渐变,可以去掉colorIndex
*/
void
tetra(const vec3& a, const vec3& b, const vec3& c, const vec3& d)
{
colorIndex = 0;
triangle(a, b, c);
colorIndex = 1;
triangle(a, c, d);
colorIndex = 2;
triangle(a, d, b);
colorIndex = 3;
triangle(b, d, c);
}
//----------------------------------------------------------------------------
/*@注释*递归划分*/
void
divide_tetra(const vec3& a, const vec3& b,
const vec3& c, const vec3& d, int count)
{
if (count > 0) {
vec3 v0 =(a + b) / 2;
vec3 v1 = (a + c) / 2;
vec3 v2 = (a + d) / 2;
vec3 v3 = (b + c) / 2;
vec3 v4 = (c + d) / 2;
vec3 v5 = (b + d) / 2;
divide_tetra(a, v0, v1, v2, count - 1);
divide_tetra(v0, b, v3, v5, count - 1);
divide_tetra(v1, v3, c, v4, count - 1);
divide_tetra(v2, v5, v4,d , count - 1);
}
else {
tetra(a, b, c, d); // draw tetrahedron at end of recursion
}
}
//----------------------------------------------------------------------------
/*@注释*读取文件,以字符串的形式返回*/
static char* readShaderSource(const char *file)
{
FILE *fp;
if (file == NULL)
return NULL;
fopen_s(&fp,file, "rb"); /*@注释,我这里是用的vs2013,vs2013不让用fp=fopen(file, "rb");*/
if (fp == NULL)return NULL;
fseek(fp, 0, SEEK_END);/*@注释:将fp所指向的文件位置指针移到以SEEK_END的基准位置,以0为位移量位置*/
GLsizei length = ftell(fp);
rewind(fp);/*@注释:将fp指示文件中位置的的指针置于文件的开头位置,并清楚文件爱你结束标志和错误标志*/
GLchar * shaderChan =new GLchar[length + 1];
fread(shaderChan, sizeof(char), length, fp);
shaderChan[length] = '\0';
if (shaderChan == NULL)
{
delete[]shaderChan;//删除着色器字符串
std::cerr << file << "error" << std::endl;
exit(EXIT_FAILURE);
}
fclose(fp);
return shaderChan;
}
/*@注释*创建并编译着色器*/
GLuint buildShader(const char* FileName, GLenum shaderType) {
GLchar*shaderChan = readShaderSource(FileName);//以字符串的形式读取文件
GLuint shaderHandle = glCreateShader(shaderType);
glShaderSource(shaderHandle, 1,&shaderChan, NULL);
//(const GLchar**)把着色器对象与相应的着色器字符相关联
delete[]shaderChan;//删除着色器字符串
glCompileShader(shaderHandle); //编译着色器
GLint compileSuccess;
glGetShaderiv(shaderHandle, GL_COMPILE_STATUS, &compileSuccess);
if (compileSuccess == GL_FALSE) {
// 若失败...
std::cerr << FileName << "failed to compile:" << std::endl;
GLint logsize;
glGetShaderiv(shaderHandle, GL_INFO_LOG_LENGTH, &logsize);
char*logMsg = new char[logsize+1];
glGetShaderInfoLog(shaderHandle, logsize, NULL, logMsg);
std::cerr << logMsg << std::endl;
delete[] logMsg;
exit(EXIT_FAILURE);
}
return shaderHandle;
}
/*@注释*初始化着色器*/
GLuint InitShader(const char *vertexShaderFilename, const char *fragmentShaderFilename)
{
/*创建顶点着色器对象和片元着色器对象*/
GLuint vertexShaderHandle = buildShader(vertexShaderFilename, GL_VERTEX_SHADER);
GLuint fragmentShaderHandle = buildShader(fragmentShaderFilename, GL_FRAGMENT_SHADER);
GLuint programHandle = glCreateProgram();
glAttachShader(programHandle, vertexShaderHandle);
glAttachShader(programHandle, fragmentShaderHandle);
glLinkProgram(programHandle);
GLint linkSuccess;
glGetProgramiv(programHandle, GL_LINK_STATUS, &linkSuccess);
if (linkSuccess == GL_FALSE) {
// 判断连接是否成功...
std::cerr << "shader program failed to link:" << std::endl;
GLint logsize;
glGetProgramiv(programHandle, GL_INFO_LOG_LENGTH, &logsize);
char*logMsg = new char[logsize];
glGetProgramInfoLog(programHandle, logsize, NULL, logMsg);
std::cerr << logMsg << std::endl;
delete[]logMsg;
exit(EXIT_FAILURE);
}
glUseProgram(programHandle);
return programHandle;
}
/*@注释*初始化GLSL*/
void
init(void)
{
/*@注释:初始化四个顶点*/
vec3 vertices[4] = {
vec3(1.0, -1.0,0.0),
vec3(-1.0,-1.0, 0.0),
vec3(0.0,1.0, 0.0),
vec3(0.0, 0.0, 0.6)
};
/*@注释:调用递归划分Subdivide the original tetrahedron*/
divide_tetra(vertices[0], vertices[1], vertices[2], vertices[3],
NumTimesToSubdivide);
/*@注释: 创建一个顶点数组对象*/
GLuint vao;
glGenVertexArrays(1, &vao);/*注释:顶点数组对象标识申请,管理着顶点属性的集合*/
glBindVertexArray(vao);/*@注释:在这里将做3个事情:1、如果参数是非0,并且是glGenvertexArrays()返回的新值,未经glBindVertexArray的
*那么他将创建一个新的顶点数组对象(这里才真正创建),并且与其名称关联起来。
*2、如果绑定包已经创建过的顶点数组对象,那么该顶点数组对象将被激活。这便于帧间切换绘制数据
*3、如果输入参数是0那么OpenGL将不再使用程序所分配的任何顶点数组对象,并且将渲染状态重设为默认值。*/
/*@注释 创建并初始化一个缓冲区对象*/
GLuint buffer;
glGenBuffers(1, &buffer);/*注释:申请顶点缓存对象标识。*/
glBindBuffer(GL_ARRAY_BUFFER, buffer);
/*注释:申请顶点缓存对象标识。
*指定顶点缓存对象的用途,GL_ARRAY_BUFFER表示顶点数据。之力glBindBuffer同样完成了3项工作:
*1、如果是第一次绑定对象(第二个参数),他是一个非0的无符号整型,那么将创建一个与名称对应的(第一个参数)新的缓存对象
*2、如果绑定到一个已经创建的缓存对象,那么她将被激活为当前使用对象。
*3、如果第二个参数是0,那么OpenGL不再为当前名称(第一个参数)应用任何缓存对象。*/
glBufferData(GL_ARRAY_BUFFER, sizeof(points) + sizeof(YanSe), NULL, GL_STATIC_DRAW);
/*注释:glBufferData( GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage )
*向缓存对象输入数
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
ConsoleApplication2.rar (68个子文件)
ConsoleApplication2
Debug
ConsoleApplication2.ilk 688KB
ConsoleApplication2.exe 76KB
ConsoleApplication2.lib 4KB
ConsoleApplication2.exp 2KB
ConsoleApplication2.pdb 3.97MB
ConsoleApplication2
resource.h 926B
ConsoleApplication2.vcxproj 4KB
ogl3.cpp 13KB
Debug
ok1.obj 2KB
ConsoleApplication2.log 2KB
vc120.pdb 1.69MB
ConsoleA.D21F7DC8.tlog
cl.command.1.tlog 6KB
rc.command.1.tlog 662B
CL.read.1.tlog 66KB
link.read.1.tlog 3KB
ConsoleApplication2.lastbuildstate 165B
rc.read.1.tlog 2KB
link.write.1.tlog 682B
CL.write.1.tlog 7KB
link.command.1.tlog 3KB
ConsoleApplication2.write.1u.tlog 68KB
rc.write.1.tlog 322B
textfile.obj 7KB
123.obj 2KB
ogl3.obj 164KB
vc120.idb 1.21MB
f.obj 2KB
ConsoleApplication2.res 32B
Source2.obj 133KB
Source.obj 191KB
textfile.cpp 835B
vshader3.glsl 124B
fshader3.glsl 167B
gl
FGLU.H 7KB
freeglut_std.h 26KB
GLSMAP.H 5KB
GLUT.H 639B
FGL.H 59KB
GLAUX.H 12KB
glew.h 1014KB
gl.h 70KB
glxew.h 73KB
wglew.h 63KB
TUBE.H 9KB
FGLUT.H 10KB
freeglut.h 681B
glu.h 14KB
freeglut_ext.h 9KB
lib
GLAUX.LIB 1.25MB
opengl.lib 237KB
glu.lib 35KB
freeglut.lib 36KB
GLUT32.LIB 26KB
glew32.lib 605KB
ConsoleApplication2.rc 3KB
dll
GLUT32.DLL 176KB
glew32.dll 395KB
opengl.dll 1.16MB
glu32.dll 117KB
OPENGL32.DLL 676KB
freeglut.dll 206KB
glu.dll 309KB
textfile.h 90B
ConsoleApplication2.vcxproj.filters 1KB
ConsoleApplication2.vcxproj.user 419B
ConsoleApplication2.v12.suo 60KB
ConsoleApplication2.sdf 61.94MB
ConsoleApplication2.sln 1003B
共 68 条
- 1
资源评论
Datrilla
- 粉丝: 87
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功