OpenGL超级宝典(第7版)笔记15 前三章实例 下个五子棋全代码 (附)

文章目录

  • OpenGL超级宝典(第7版)笔记15 前三章实例 下个五子棋全代码 (附)

#pragma once#ifndef BASIC_RA
#define BASIC_RA
#include<iostream>
#include<Windows.h>#define GLEW_STATIC
#include<glew.h>
#include<glfw3.h>
#include<math.h>
#endif //!BASIC_RAvoid startup();
void render(double currentTime);
void shutdown();
void compile_shader(void);
void delete_shader(void);
GLuint linkprogram1(void);
GLuint linkprogram2(void);GLuint vs[3]={0};
GLuint tcs[3]={0};
GLuint tes[3]={0};
GLuint gs[3]={0};
GLuint fs[3]={0};
GLuint rendering_program1;
GLuint rendering_program2;
GLuint vertex_array_object;int windowhigh = 1000;
int windowwide = 1000;GLdouble lastx = 0.0f;
GLdouble lasty = 0.0f;
GLdouble kickx = 0.0f;
GLdouble kicky = 0.0f;
GLint arrayx = 0;
GLint arrayy = 0;
GLint nowkind = 1;//黑为1白为2
int iswin = 0;GLint judgewin(GLint x, GLint y);
struct chess{GLchar chesskind=0;//还可以给棋子添加更多的属性~
};
chess chessboard[17][17];
GLint chess_number=0;
GLchar chess_draw_list[17*17][3]={0}; //void drawString(const char* str) //屏幕显示字体
//{//  static int isFirstCall = 1;
//  static GLuint lists;
//
//  if (isFirstCall) {//      isFirstCall = 0;
//      // 申请MAX_CHAR个连续的显示列表编号
//      lists = glGenLists(200);
//      // 把每个字符的绘制命令都装到对应的显示列表中
//      wglUseFontBitmaps(wglGetCurrentDC(), 0, 20, lists);
//  }
//  // 调用每个字符对应的显示列表,绘制每个字符
//  for (; *str != '\0'; ++str) {//      glCallList(lists + *str);
//  }
//}
//void selectFont(int size, int charset, const char* face) {//  HFONT hFont = CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0,
//      charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
//      DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face);
//  HFONT hOldFont = (HFONT)SelectObject(wglGetCurrentDC(), hFont);
//  DeleteObject(hOldFont);
//}
我想试着在屏幕上输出字,但是没有成功~~~void mouse_callback(GLFWwindow* window, double xpos, double ypos) {//    if (lastx == 0.0f) {//        lastx = xpos;//    }//    if (lasty == 0.0f) {//        lasty = ypos;//    }// if((angy+ypos-lasty)*rotasen>3.141f/2.0f){//        angy=3.141f/(rotasen*2.0f);//  }else if((angy+ypos-lasty)*rotasen<-3.141f/2.0f){//     angy=-3.141f/(rotasen*2.0f);// }else{//        angy+=ypos-lasty;//   }// angx+=xpos-lastx;lastx=xpos;lasty=ypos;
}
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode) {if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)glfwSetWindowShouldClose(window, GL_TRUE);
}
void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
{int whichkey=0;//左键为1右键为2中键为3 if (action == GLFW_PRESS) switch (button){case GLFW_MOUSE_BUTTON_LEFT:kickx = lastx;kicky = lasty;whichkey=1;std::cout << "left down" << std::endl;std::cout << lastx << "  " << lasty << std::endl;break;case GLFW_MOUSE_BUTTON_MIDDLE:kickx = lastx;kicky = lasty;whichkey=3;std::cout << "mid down" << std::endl;std::cout << lastx << "  " << lasty << std::endl;break;case GLFW_MOUSE_BUTTON_RIGHT:kickx = lastx;kicky = lasty;whichkey=2;std::cout << "right down" << std::endl;std::cout << lastx << "  " << lasty << std::endl;if (nowkind == 1)nowkind = 2;elsenowkind = 1;break;default:return;}switch(whichkey){case 1:if (kickx > 150 && kicky > 150 && kickx < 850 && kicky < 850) {arrayx = (kickx - 170) / 38.75f + 1.0f;arrayy = (kicky - 170) / 38.75f + 1.0f;std::cout << "arrayx=" << arrayx << "  " << "arrayy=" << arrayy << std::endl;if (chessboard[arrayx][arrayy].chesskind == 0) {chessboard[arrayx][arrayy].chesskind = nowkind;chess_draw_list[chess_number][0]=nowkind;chess_draw_list[chess_number][1]=arrayx;chess_draw_list[chess_number][2]=arrayy;chess_number++;if (judgewin(arrayx, arrayy) == 1) {std::cout << "nowkind " << nowkind << " is win!!" << std::endl;iswin = nowkind;}if (nowkind == 1)nowkind = 2;elsenowkind = 1;}}break;case 3:if (chess_number > 0) {chess_number--;chessboard[chess_draw_list[chess_number][1]][chess_draw_list[chess_number][2]].chesskind = 0;chess_draw_list[chess_number][0]=0;chess_draw_list[chess_number][1]=0;chess_draw_list[chess_number][2] = 0;if (nowkind == 1)nowkind = 2;elsenowkind = 1;}break;default:break;} return;
}
int main() {/**********part_mark**********/
#pragma region 初始化窗口glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);GLFWwindow* window = glfwCreateWindow(windowwide, windowhigh, "LearnOpenGL", nullptr, nullptr);if (window == nullptr) {std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);glewExperimental = GL_TRUE;if (glewInit() != GLEW_OK) {std::cout << "Failed to initialize GLEW" << std::endl;return -1;}int win_width = windowwide, win_height = windowhigh;glfwGetFramebufferSize(window, &win_width, &win_height);glViewport(0, 0, win_width, win_height);
#pragma endregion/**********part_mark**********/startup();/**********part_mark**********/glfwSetCursorPosCallback(window, mouse_callback);glfwSetKeyCallback(window, key_callback);glfwSetMouseButtonCallback(window, mouse_button_callback);while (!glfwWindowShouldClose(window)){glfwPollEvents();double timeValue = glfwGetTime();render(timeValue);glfwSwapBuffers(window);if (iswin == 1) {MessageBox(0, TEXT("黑棋胜利!!"), TEXT("result"), 0);iswin = 0;for (;chess_number > 0;) {if (chess_number > 0) {chess_number--;chessboard[chess_draw_list[chess_number][1]][chess_draw_list[chess_number][2]].chesskind = 0;chess_draw_list[chess_number][0] = 0;chess_draw_list[chess_number][1] = 0;chess_draw_list[chess_number][2] = 0;}}}else if (iswin == 2) {MessageBox(0, TEXT("白棋胜利!!"), TEXT("result"), 0);iswin = 0;for (;chess_number > 0;) {if (chess_number > 0) {chess_number--;chessboard[chess_draw_list[chess_number][1]][chess_draw_list[chess_number][2]].chesskind = 0;chess_draw_list[chess_number][0] = 0;chess_draw_list[chess_number][1] = 0;chess_draw_list[chess_number][2] = 0;}}}}/**********part_mark**********/shutdown();glfwTerminate();return 0;
}void startup() {compile_shader();rendering_program1 = linkprogram1();rendering_program2 = linkprogram2();glCreateVertexArrays(1, &vertex_array_object);glBindVertexArray(vertex_array_object);glPatchParameteri(GL_PATCH_VERTICES, 4);//是在这里,只设定一次吗? 好像是glLineWidth(3.0);glPointSize(25.0);
}void render(double currentTime) {static const GLfloat red[] = { 0.2f,0.3f,0.4f,1.0f };static const GLfloat black[] = { 0.2f,0.2f,0.2f,1.0f };static const GLfloat white[] = { 0.5f,0.5f,0.5f,1.0f };if (iswin == 0) {glClearBufferfv(GL_COLOR, 0, red);}else if (iswin == 1) {glClearBufferfv(GL_COLOR, 0, black);}else if (iswin == 2) {glClearBufferfv(GL_COLOR, 0, white);}glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);glUseProgram(rendering_program1);glDrawArrays(GL_PATCHES, 0, 4);glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);glUseProgram(rendering_program2);for (int i = 0;i < chess_number;i++) {GLfloat a[4] = { chess_draw_list[i][0],chess_draw_list[i][1],chess_draw_list[i][2],0.0f };glVertexAttrib4fv(0, a);glDrawArrays(GL_POINTS, 0, 1);}
}void shutdown() {delete_shader();glDeleteVertexArrays(1, &vertex_array_object);glDeleteProgram(rendering_program1);glDeleteProgram(rendering_program2);glDeleteVertexArrays(1, &vertex_array_object);//为什么要删除两次??
}void compile_shader(void) {#pragma region 编辑着色器内容static const GLchar* vertex_shader_source[] = {"#version 450 core                                               \n""void main(void)                                               \n""{                                                             \n""  const vec4 vertices[4]=vec4[4](vec4(0.7,0.7,0.5,1.0),      \n""                          vec4(0.7,-0.7,0.5,1.0),         \n""                          vec4(-0.7,-0.7,0.5,1.0),                \n""                          vec4(-0.7,0.7,0.5,1.0));            \n""  gl_Position = vertices[gl_VertexID];                       \n""}                                                             \n"};static const GLchar* tess_control_shader_source[] = {"#version 450 core                     \n""layout (vertices=4) out;             \n""void main(void)                       \n""{                                     \n""  if(gl_InvocationID==0){               \n""      gl_TessLevelInner[0]=18.0;     \n""      gl_TessLevelInner[1]=18.0;     \n""      gl_TessLevelOuter[0]=18.0;     \n""      gl_TessLevelOuter[1]=18.0;     \n""      gl_TessLevelOuter[2]=18.0;     \n""      gl_TessLevelOuter[3]=18.0;     \n""  }                                   \n""  gl_out[gl_InvocationID].gl_Position=gl_in[gl_InvocationID].gl_Position;\n""}                                     \n"};static const GLchar* tess_evaluation_shader_source[] = {"#version 450 core                      \n""layout (quads,equal_spacing,ccw)in;       \n""void main(void)                       \n""{                                     \n"//  "  gl_Position=(gl_TessCoord.x*gl_in[0].gl_Position+     \n"//  "               gl_TessCoord.y*gl_in[1].gl_Position+      \n"//  "               gl_TessCoord.z*gl_in[2].gl_Position);      \n"这不适用于四边形"  float u = gl_TessCoord.x;      \n""  float v = gl_TessCoord.y;      \n""  float omu = 1-u;               \n""  float omv = 1-v;               \n""  gl_Position =                  \n""  omu *omv    *gl_in[0].gl_Position+     \n""  u   *omv    *gl_in[1].gl_Position+     \n""  u   *v      *gl_in[2].gl_Position+     \n""  omu *v      *gl_in[3].gl_Position;      \n""}                                     \n"};static const GLchar* geometry_shader_source[] = {"#version 450 core                             \n""layout (triangles) in;                            \n""layout (line_strip,max_vertices=8) out;      \n""void main(void)                               \n""{                                             \n""if(gl_in[0].gl_Position.x<0.5){                                                    \n""  gl_Position=gl_in[0].gl_Position;EmitVertex();                                 \n""  gl_Position=gl_in[0].gl_Position+vec4(0.1,0.0,0.0,0.0);EmitVertex();          \n""}else{                                                                                \n""  gl_Position=gl_in[0].gl_Position;EmitVertex();                                 \n""  gl_Position=gl_in[0].gl_Position;EmitVertex();                                 \n""}                                                                                 \n""if(gl_in[0].gl_Position.x>-0.5){                                                   \n""  gl_Position=gl_in[0].gl_Position;EmitVertex();                                 \n""  gl_Position=gl_in[0].gl_Position+vec4(-0.1,0.0,0.0,0.0);EmitVertex();         \n""}else{                                                                                \n""  gl_Position=gl_in[0].gl_Position;EmitVertex();                                 \n""  gl_Position=gl_in[0].gl_Position;EmitVertex();                                 \n""}                                                                                 \n""if(gl_in[0].gl_Position.y<0.5){                                                    \n""  gl_Position=gl_in[0].gl_Position;EmitVertex();                                 \n""  gl_Position=gl_in[0].gl_Position+vec4(0.0,0.1,0.0,0.0);EmitVertex();          \n""}else{                                                                                \n""  gl_Position=gl_in[0].gl_Position;EmitVertex();                                 \n""  gl_Position=gl_in[0].gl_Position;EmitVertex();                                 \n""}                                                                                 \n""if(gl_in[0].gl_Position.y>-0.5){                                                   \n""  gl_Position=gl_in[0].gl_Position;EmitVertex();                                 \n""  gl_Position=gl_in[0].gl_Position+vec4(0.0,-0.1,0.0,0.0);EmitVertex();         \n""}else{                                                                                \n""  gl_Position=gl_in[0].gl_Position;EmitVertex();                                 \n""  gl_Position=gl_in[0].gl_Position;EmitVertex();                                 \n""}                                                                                 \n""}                                             \n"};static const GLchar* fragment_shader_source[] = {"#version 450 core                     \n""out vec4 color;                       \n""void main(void)                       \n""{                                     \n""  color = vec4(0.9,0.9,0.8,1.0);     \n""}                                     \n"};static const GLchar* vertex_shader_source2[] = {"#version 450 core                          \n""layout(location = 0) in vec4 a;          \n""out vec4 vscolor;                         \n""void main(void)                           \n""{                                         \n""  float x = 0.0;                         \n""  float y = 0.0;                         \n""  x = (a.y - 9) * 0.7 / 9.0;             \n""  y = (-a.z + 9) * 0.7 / 9.0;               \n""  gl_Position = vec4(x, y, 0.5, 1.0);        \n""  if ((a.x -1.0)<0.001&&(a.x -1.0)>-0.001) {    \n""      vscolor = vec4(0.0,0.0,0.0,1.0);       \n""  }                                           \n""  else if ((a.x -2.0)<0.001&&(a.x -2.0)>-0.001) {\n""     vscolor = vec4(1.0, 1.0, 1.0, 1.0);        \n""  }                                           \n""  else {                                      \n""      vscolor = vec4(1.0, 0.0, 0.0, 1.0);        \n""  }                                           \n""}                                         \n"};static const GLchar* fragment_shader_source2[] = {"#version 450 core                                \n""in vec4 vscolor;//黑为1白为0                  \n""out vec4 color;                               \n""void main(void)                               \n""{                                             \n""  color = vscolor;                           \n""}                                             \n"};
#pragma endregion#pragma region 编译各种着色器并检查情况GLint shader_success;GLchar infoLog[512];//定义一个整型变量来表示是否成功编译,还定义了一个储存错误消息(如果有的话)的容器。vs[0] = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vs[0], 1, vertex_shader_source, NULL);glCompileShader(vs[0]);glGetShaderiv(vs[0], GL_COMPILE_STATUS, &shader_success);//检查编译是否成功if (!shader_success){glGetShaderInfoLog(vs[0], 512, NULL, infoLog);std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;}vs[1] = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vs[1], 1, vertex_shader_source2, NULL);glCompileShader(vs[1]);glGetShaderiv(vs[1], GL_COMPILE_STATUS, &shader_success);//检查编译是否成功if (!shader_success){glGetShaderInfoLog(vs[1], 512, NULL, infoLog);std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;}fs[0] = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fs[0], 1, fragment_shader_source, NULL);//试试这个是否有格子花纹 glCompileShader(fs[0]);glGetShaderiv(fs[0], GL_COMPILE_STATUS, &shader_success);//检查编译是否成功if (!shader_success){glGetShaderInfoLog(fs[0], 512, NULL, infoLog);std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;}fs[1] = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fs[1], 1, fragment_shader_source2, NULL);glCompileShader(fs[1]);glGetShaderiv(fs[1], GL_COMPILE_STATUS, &shader_success);//检查编译是否成功if (!shader_success){glGetShaderInfoLog(fs[1], 512, NULL, infoLog);std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;}tcs[0] = glCreateShader(GL_TESS_CONTROL_SHADER);glShaderSource(tcs[0], 1, tess_control_shader_source, NULL);glCompileShader(tcs[0]);glGetShaderiv(tcs[0], GL_COMPILE_STATUS, &shader_success);//检查编译是否成功if (!shader_success){glGetShaderInfoLog(tcs[0], 512, NULL, infoLog);std::cout << "ERROR::SHADER::TESS_CONTROL::COMPILATION_FAILED\n" << infoLog << std::endl;}tes[0] = glCreateShader(GL_TESS_EVALUATION_SHADER);glShaderSource(tes[0], 1, tess_evaluation_shader_source, NULL);glCompileShader(tes[0]);glGetShaderiv(tes[0], GL_COMPILE_STATUS, &shader_success);//检查编译是否成功if (!shader_success){glGetShaderInfoLog(tes[0], 512, NULL, infoLog);std::cout << "ERROR::SHADER::TESS_EVALUATION::COMPILATION_FAILED\n" << infoLog << std::endl;}gs[0] = glCreateShader(GL_GEOMETRY_SHADER);glShaderSource(gs[0], 1, geometry_shader_source, NULL);glCompileShader(gs[0]);glGetShaderiv(gs[0], GL_COMPILE_STATUS, &shader_success);//检查编译是否成功if (!shader_success){glGetShaderInfoLog(gs[0], 512, NULL, infoLog);std::cout << "ERROR::SHADER::GEOMETRY_SHADER::COMPILATION_FAILED\n" << infoLog << std::endl;}
#pragma endregionreturn;
}void delete_shader(void){int i=0;for(i=0;i<3;i++){if(vs[i]!=0)glDeleteShader(vs[i]);if(tcs[i]!=0)glDeleteShader(tcs[i]);if(tes[i]!=0)glDeleteShader(tes[i]);if(gs[i]!=0)glDeleteShader(gs[i]);if(fs[i]!=0)glDeleteShader(fs[i]);}return;
}
GLuint linkprogram1(void){GLuint program = glCreateProgram();glAttachShader(program,vs[0]);glAttachShader(program,tcs[0]);glAttachShader(program,tes[0]);glAttachShader(program,gs[0]);glAttachShader(program,fs[0]);glLinkProgram(program);GLint success;glGetProgramiv(program, GL_LINK_STATUS, &success);if (!success) {GLchar* m_infor = new GLchar[1024];glGetProgramInfoLog(program, 1023, NULL, m_infor);std::cout << "ERROR_IN: program " << std::endl << "\tError in link program " << program << std::endl;std::cout << "ERROR_IN: program " << std::endl << "\terror message : " << std::endl << m_infor << std::endl;delete []m_infor ;return 0;}return program;
}
GLuint linkprogram2(void){GLuint program = glCreateProgram();glAttachShader(program,vs[1]);//glAttachShader(program,tcs[1]);//glAttachShader(program,tes[1]);//glAttachShader(program,gs[1]);glAttachShader(program,fs[1]);glLinkProgram(program);GLint success;glGetProgramiv(program, GL_LINK_STATUS, &success);if (!success) {GLchar* m_infor = new GLchar[1024];glGetProgramInfoLog(program, 1023, NULL, m_infor);std::cout << "ERROR_IN: program " << std::endl << "\tError in link program " << program << std::endl;std::cout << "ERROR_IN: program " << std::endl << "\terror message : " << std::endl << m_infor << std::endl;delete []m_infor;return 0;}return program;
}GLint judgewin(GLint x, GLint y) {GLint result = 0;GLint same = 1;GLint direction = 0;int i = x, j = y;//水平方向判定i = x;    j = y; same = 1;  direction = 0;while (1) {if (direction == 0) {i++;if (i >= 0 && i <= 16) {if (chessboard[i][j].chesskind == chessboard[i - 1][j].chesskind)same++;else {direction = 1;i = x;j = y;}}else {direction = 1;i = x;j = y;}}else {i--;if (i >= 0 && i <= 16) {if (chessboard[i][j].chesskind == chessboard[i + 1][j].chesskind)same++;elsebreak;}elsebreak;}}if (same >= 5) {result= 1;}//垂直方向判定i = x;  j = y; same = 1;  direction = 0;while (1) {if (direction == 0) {j++;if (j >= 0 && j <= 16) {if (chessboard[i][j].chesskind == chessboard[i][j-1].chesskind)same++;else {direction = 1;i = x;j = y;}}else {direction = 1;i = x;j = y;}}else {j--;if (j >= 0 && j <= 16) {if (chessboard[i][j].chesskind == chessboard[i][j+1].chesskind)same++;elsebreak;}elsebreak;}}if (same >= 5) {result = 1;}//左上到右下i = x;  j = y; same = 1;  direction = 0;while (1) {if (direction == 0) {i++;j++;if (i >= 0 && i <= 16&&j >= 0 && j <= 16) {if (chessboard[i][j].chesskind == chessboard[i - 1][j-1].chesskind)same++;else {direction = 1;i = x;j = y;}}else {direction = 1;i = x;j = y;}}else {i--;j--;if (i >= 0 && i <= 16 && j >= 0 && j <= 16) {if (chessboard[i][j].chesskind == chessboard[i + 1][j+1].chesskind)same++;elsebreak;}elsebreak;}}if (same >= 5) { result = 1; }//右上到左下i = x; j = y; same = 1;  direction = 0;while (1) {if (direction == 0) {i++;j--;if (i >= 0 && i <= 16 && j >= 0 && j <= 16) {if (chessboard[i][j].chesskind == chessboard[i - 1][j + 1].chesskind)same++;else {direction = 1;i = x;j = y;}}else {direction = 1;i = x;j = y;}}else {i--;j++;if (i >= 0 && i <= 16 && j >= 0 && j <= 16) {if (chessboard[i][j].chesskind == chessboard[i + 1][j - 1].chesskind)same++;elsebreak;}elsebreak;}}if (same >= 5) { result = 1; }return result;
}

OpenGL超级宝典(第7版)笔记15 前三章实例 下个五子棋全代码 (附)相关推荐

  1. OpenGL超级宝典(第7版)笔记13 前三章实例 下个五子棋 (上)

    OpenGL超级宝典(第7版)笔记13 前三章实例 下个五子棋 (上) 文章目录 OpenGL超级宝典(第7版)笔记13 前三章实例 下个五子棋 (上) 前言 1 初构建 2 构建数据结构 3 绘制 ...

  2. 《OpenGL超级宝典第5版》学习笔记(一)—— 第一个OpenGL程序

    // GLTools库包含了一个用于操作矩阵和向量的3D数学库,并依靠GLEW获得OpenGL3.3中用来产生和渲染一些简单3D对象的函数, // 以及对视觉平截头体.相机类和变换矩阵进行管理的函数的 ...

  3. OpenGL超级宝典第7版环境配置

    1.下载源码 地址:http://www.openglsuperbible.com/ 2.运行Cmake,编译glfw库 打开项目后,编译工程(Debug和Release下都编译). 把E:\open ...

  4. OpenGL超级宝典(第7版)笔记4 渲染管线介绍 清单2.3-2.7

    OpenGL超级宝典(第7版)笔记4 渲染管线介绍 清单2.3-2.7 文章目录 OpenGL超级宝典(第7版)笔记4 渲染管线介绍 清单2.3-2.7 1 OpenGL简介 2 OpenGL渲染管线 ...

  5. OpenGL超级宝典学习笔记——操作矩阵

    为了更强大的功能和灵活性,我们有时需要直接操作矩阵.在OpenGL中4x4的矩阵用包含16个浮点数值的一维数组来表示,而不是用二维的4x4的数组来表示.OpenGL之所以这么做,因为使用一维数组更高效 ...

  6. OpenGL超级宝典(第五版)环境配置

    本文转自:http://blog.csdn.net/sunny_unix/article/details/8056807,感谢作者分享. OpenGL超级宝典(第五版)环境配置 Vs2008+winX ...

  7. OpenGL超级宝典(第五版)环境配置【转】

    OpenGL超级宝典(第五版)环境配置 Vs2008+winXP  后续会整理Ubuntu 12.04LTS下的配置作者:sunny_unix 1.各种库的配置 (1)glew 下载:https:// ...

  8. OpenGL超级宝典(第五版) 环境配置

    特别提醒:有些在word中或者其他中的代码复制到vs中会报错,原因是word中有些隐含的字符,复制到vs中就会报错:重新输一遍就可以解决问题,这里只是提醒下! 可以参阅我前面转载的一篇文章,进行比较然 ...

  9. OpenGL超级宝典(第五版) 环境配置(WinXp+VS2008)

    转自:http://blog.csdn.net/sunny_unix/article/details/8056807 OpenGL超级宝典(第五版)环境配置 1.各种库的配置 (1)glew 下载:h ...

  10. [转]OpenGL超级宝典 5e 环境配置

    OpenGL超级宝典(第五版)环境配置 1.各种库的配置 (1)glew 下载:https://sourceforge.net/projects/glew/files/glew/1.7.0/glew- ...

最新文章

  1. 解决IE8下父容器背景图片不显示的问题
  2. 如何在Access中参数化日期类型,以解决Data type mismatch in criteria expression的问题...
  3. pcb成型板aoi检测_通过自动光学检测(AOI)实现PCB高速检测
  4. python求平均工资_python如何求列表平均值?
  5. JSP基于JDBC操作MSSQL2008数据库
  6. python 字符串替换_python字符串替换的2种方法
  7. 企业私有云应用之使用OZ制作openstack镜像
  8. poj 4451 Dressing 一个小模拟 金华regional
  9. 实习踩坑之路:利用Java8新特性实现不同范型List之间的相互转换
  10. php合并两个有序链表,PHP如何实现合并两个有序链表为一个有序链表(代码)
  11. Vscode 附加进程调试
  12. java crach 日志解析
  13. Visio2010中设置线为直线
  14. CENTOS linux kernel 内核编译
  15. Java8新特性(一)—————Lambda表达式
  16. 【7】win10 病毒和威胁防护服务停止,立即重启报错
  17. 设计c语言程序得到回文数,C语言程序设计实训题目.pdf
  18. [洛谷 P4084 USACO17DEC] Barn Painting G (树形dp经典)
  19. 基于GAN的小目标检测算法总结(1)——Perpetual GAN
  20. 全屋2.5G,选购指南(本人亲测)

热门文章

  1. java程序设计实用教程第五版叶核亚答案_java程序设计实用教程 (第3版) 叶核亚 习题答案 所有答案1—12章...
  2. vb6源码 ymodem_VB6 实时曲线显示源码全套资料
  3. 解析WAP技术(转)
  4. 关于:win远程桌面连接命令怎么用
  5. 【免疫优化物流选址】基于MATLAB的免疫优化算法在物流配送中心选址中的应用仿真
  6. Java操作数据库(一,JDBC的入门)
  7. Fiddler4抓包工具使用教程
  8. jQuery 帮助文档 api
  9. python调用通达信函数大全_python通达信公式函数,通达信软件公式函数SMA
  10. Jmeter下载安装详细步骤(最新)