蓝宝书第一个opengl程序怎么配置添加opengl gltools下载库?

OpenGL超级宝典的GLTools和freeglut - 下载频道
- CSDN.NET
&&&&OpenGL超级宝典的GLTools和freeglut
OpenGL超级宝典的GLTools和freeglut
针对Linux下Codeblocks使用OpenGL超级宝典(第五版)的实例对GLTools的代码进行修改,使可以正常运行。
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
开发技术下载排行>> GLTools.h - 史上最全opengl开发工具库,一
点击查看更多 ▼
点击收缩隐藏 ▲
GLTools.h - 史上最全opengl开发工具库,一
源码下载: &
// GLTools.h
// OpenGL SuperBible
/* Copyright 1998 - 2003 Richard S. Wright Jr.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list
of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list
of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
Neither the name of Richard S. Wright Jr. nor the names of other contributors may be used
to endorse or promote products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &AS IS& AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef __GLTOOLS__LIBRARY
#define __GLTOOLS__LIBRARY
// There is a static block allocated for loading shaders to
// prevent heap fragmentation
#define MAX_SHADER_LENGTH
// Bring in OpenGL
// Windows
#ifdef WIN32
#include &windows.h&
// Must have for Windows platform builds
#ifndef GLEW_STATIC
#define GLEW_STATIC
#include &gl\glew.h&
// OpenGL Extension &autoloader&
#include &gl\gl.h&
// Microsoft OpenGL headers (version 1.1 by themselves)
// Mac OS X
#ifdef __APPLE__
#include &stdlib.h&
#include &TargetConditionals.h&
#if TARGET_OS_IPHONE | TARGET_IPHONE_SIMULATOR
#include &OpenGLES/ES2/gl.h&
#include &OpenGLES/ES2/glext.h&
#define OPENGL_ES
#include &GL/glew.h&
#include &OpenGL/gl.h&
// Apple OpenGL haders (version depends on OS X SDK version)
#ifdef linux
#define GLEW_STATIC
#include &glew.h&
//////////////////////// TEMPORARY TEMPORARY TEMPORARY - On SnowLeopard this is suppored, but GLEW doens't hook up properly
//////////////////////// Fixed probably in 10.6.3
#ifdef __APPLE__
#define glGenVertexArrays glGenVertexArraysAPPLE
#define glDeleteVertexArrays
glDeleteVertexArraysAPPLE
#define glBindVertexArray glBindVertexArrayAPPLE
#ifndef OPENGL_ES
#define glGenerateMipmap
glGenerateMipmapEXT
// Universal includes
#include &stdio.h&
#include &math.h&
#include &math3d.h&
#include &GLBatch.h&
#include &GLTriangleBatch.h&
///////////////////////////////////////////////////////
// Macros for big/little endian happiness
// These are intentionally written to be easy to understand what they
// are doing... no flames please on the inefficiency of these.
#ifdef __BIG_ENDIAN__
///////////////////////////////////////////////////////////
// This function says, &this pointer is a little endian value&
// If the value must be changed it is... otherwise, this
// function is defined away below (on Intel systems for example)
inline void LITTLE_ENDIAN_WORD(void *pWord)
unsigned char *pBytes = (unsigned char *)pW
temp = pBytes[0];
pBytes[0] = pBytes[1];
pBytes[1] =
///////////////////////////////////////////////////////////
// This function says, &this pointer is a little endian value&
// If the value must be changed it is... otherwise, this
// function is defined away below (on Intel systems for example)
inline void LITTLE_ENDIAN_DWORD(void *pWord)
unsigned char *pBytes = (unsigned char *)pW
// Swap outer bytes
temp = pBytes[3];
pBytes[3] = pBytes[0];
pBytes[0] =
// Swap inner bytes
temp = pBytes[1];
pBytes[1] = pBytes[2];
pBytes[2] =
// Define them away on little endian systems
#define LITTLE_ENDIAN_WORD
#define LITTLE_ENDIAN_DWORD
///////////////////////////////////////////////////////////////////////////////
THE LIBRARY....
///////////////////////////////////////////////////////////////////////////////
// Get the OpenGL version
void gltGetOpenGLVersion(GLint &nMajor, GLint &nMinor);
// Check to see if an exension is supported
int gltIsExtSupported(const char *szExtension);
// Set working directoyr to /Resources on the Mac
void gltSetWorkingDirectory(const char *szArgv);
///////////////////////////////////////////////////////////////////////////////
GLbyte* gltReadBMPBits(const char *szFileName, int *nWidth, int *nHeight);
/////////////////////////////////////////////////////////////////////////////////////
// Load a .TGA file
GLbyte *gltReadTGABits(const char *szFileName, GLint *iWidth, GLint *iHeight, GLint *iComponents, GLenum *eFormat);
// Capture the frame buffer and write it as a .tga
// Does not work on the iPhone
#ifndef OPENGL_ES
GLint gltGrabScreenTGA(const char *szFileName);
// Make Objects
void gltMakeTorus(GLTriangleBatch& torusBatch, GLfloat majorRadius, GLfloat minorRadius, GLint numMajor, GLint numMinor);
void gltMakeSphere(GLTriangleBatch& sphereBatch, GLfloat fRadius, GLint iSlices, GLint iStacks);
void gltMakeDisk(GLTriangleBatch& diskBatch, GLfloat innerRadius, GLfloat outerRadius, GLint nSlices, GLint nStacks);
void gltMakeCylinder(GLTriangleBatch& cylinderBatch, GLfloat baseRadius, GLfloat topRadius, GLfloat fLength, GLint numSlices, GLint numStacks);
void gltMakeCube(GLBatch& cubeBatch, GLfloat fRadius);
// Shader loading support
void gltLoadShaderSrc(const char *szShaderSrc, GLuint shader);
bool gltLoadShaderFile(const char *szFile, GLuint shader);
GLuint gltLoadShaderPair(const char *szVertexProg, const char *szFragmentProg);
gltLoadShaderPairWithAttributes(const char *szVertexProg, const char *szFragmentProg, ...);
GLuint gltLoadShaderPairSrc(const char *szVertexSrc, const char *szFragmentSrc);
GLuint gltLoadShaderPairSrcWithAttributes(const char *szVertexProg, const char *szFragmentProg, ...);
bool gltCheckErrors(GLuint progName = 0);
void gltGenerateOrtho2DMat(GLuint width, GLuint height, M3DMatrix44f &orthoMatrix, GLBatch &screenQuad);
源码下载: &
源码文件列表
温馨提示: 点击源码文件名可预览文件内容哦 ^_^
名称大小日期
&GLU.DLL308.50 kB13-11-07 11:05
&GLUT.DLL151.00 kB13-11-07 11:05
&GLUT32.DLL232.00 kB13-11-07 11:05
&OPENGL.DLL1.16 MB13-11-07 11:05
&freeglut.dll271.50 kB07-10-10 22:29
&freeglut.lib34.15 kB07-10-10 22:29
&freeglut_static.lib516.92 kB04-04-10 21:53
&681.00 B04-04-10 21:54
&7.65 kB04-04-10 21:54
&25.54 kB04-04-10 21:54
&639.00 B04-04-10 21:54
&gltools.lib1.70 MB04-08-10 05:16
&735.01 kB21-07-10 00:11
&58.24 kB01-07-10 03:57
&53.76 kB21-03-10 02:17
&4.62 kB12-10-10 12:28
&2.03 kB21-03-10 02:17
&14.59 kB20-07-10 08:00
&11.82 kB21-03-10 02:17
&2.92 kB21-03-10 02:17
&5.76 kB21-07-10 00:11
&4.44 kB21-07-10 00:11
&6.63 kB21-07-10 00:11
&4.32 kB05-04-10 04:52
&28.09 kB03-07-10 20:19
&3.38 kB21-03-10 02:17
&14.03 kB21-09-13 20:51
&Glu32.lib12.35 kB21-09-13 20:54
&GLU32.DLL136.44 kB29-07-96 12:09
&glut.def2.24 kB10-02-99 12:46
&27.02 kB13-12-00 00:22
&glut32.dll232.00 kB08-11-01 02:27
&glut32.lib28.05 kB08-11-01 02:27
&25.83 kB08-11-01 02:42
&.nfo746.00 B21-04-05 19:25
&glaux.dll1.32 MB25-11-97 16:11
&11.74 kB08-02-96 18:15
&10.33 kB09-08-06 14:41
&mxymxy_GLaux.gif15.04 kB10-08-06 00:40
&glut.dll166.00 kB18-08-98 16:25
&20.94 kB18-08-98 16:24
&glut.lib77.79 kB18-08-98 16:25
&glut32.dll166.00 kB18-08-98 16:25
&glut32.lib78.03 kB18-08-98 16:25
&67.46 kB13-11-07 11:05
&11.74 kB13-11-07 11:05
&12.49 kB13-11-07 11:05
&17.85 kB13-11-07 11:05
&27.02 kB13-11-07 11:05
&16.78 kB13-11-07 11:05
&GLAUX.LIB1.25 MB13-11-07 11:05
&glu.lib34.77 kB13-11-07 11:05
&GLU32.LIB48.35 kB13-11-07 11:05
&glut.lib77.79 kB13-11-07 11:05
&GLUT32.LIB67.95 kB13-11-07 11:05
&opengl.lib237.11 kB13-11-07 11:05
&OPENGL32.LIB328.39 kB13-11-07 11:05
&&GL&0.00 B06-10-13 15:51
&&GL&0.00 B06-10-13 15:51
&&glut-3.7.6-bin&0.00 B06-10-13 15:51
&&include&0.00 B06-10-13 15:51
&&include&0.00 B06-10-13 15:51
&&GLU32&0.00 B06-10-13 15:51
&&glut-3.7.6-bin&0.00 B06-10-13 15:51
&&mxymxy_GLaux&0.00 B06-10-13 15:51
&&freeglutFiles&0.00 B06-10-13 15:51
&&GLTools-Win&0.00 B06-10-13 15:51
&&glut-glaux-glu&0.00 B06-10-13 15:51
&&DLL&0.00 B24-09-13 19:10
&&GLTools-Freeglut&0.00 B06-10-13 15:51
&&GLU&0.00 B06-10-13 15:51
&&glut-glaux-glu&0.00 B06-10-13 15:51
&&glutdlls37beta&0.00 B06-10-13 15:51
&&INCLUDE&0.00 B24-09-13 19:10
&&LIB&0.00 B24-09-13 19:10
&&OpenGL开发库&0.00 B06-10-13 15:51
Sponsored links
23 篇源代码 21 篇源代码 18 篇源代码 13 篇源代码 9 篇源代码
285 篇源代码 173 篇源代码 48 篇源代码 42 篇源代码 36 篇源代码
登录 CodeForge
还没有CodeForge账号?
Switch to the English version?
CF仔没有找到您要的代码,请去留下您的问题吧,可能会有大神帮助你哦!
该用户暂时未开通博客
请按 Ctrl+D 键添加到收藏夹。OpenGL超级宝典学习笔记——光照参数与材料属性_Linux编程_Linux公社-Linux系统门户网站
你好,游客
OpenGL超级宝典学习笔记——光照参数与材料属性
来源:Linux社区&
作者:Mario_Q
glEnable(GL_LIGHTING);
这个函数调用告诉OpenGL使用材料属性和光照参数去决定每个顶点的颜色值。如果没有开启这个函数,则看到的物体是昏暗的。开启光照后会根据你的材料属性和光照参数计算顶点的颜色值。下图对比未开启光照和开启光照的效果。
(未开启光照)
(开启光照)
设置全局环境光
OpenGL提供了一种全局的环境光。这种光是一种向所有方向均匀发射的光源。它可以照明没有被光源直接照射的物体的背面。
在OpenGL中通过glLightModel这个函数来设置全局环境光。第一个参数是GL_LIGHT_MODEL_AMBIETN。
//明亮的白光GLfloat ambientLight[] = {1.0f, 1.0f, 1.0f, 1.0f};//开启光照glEnable(GL_LIGHTING);//设置全局环境光为白光glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);
全局环境光照的默认RGBA值是(0.2, 0.2, 0.2, 1.0),这个值是比较昏暗的。
设置材料属性
设置好了全局环境光源后,我们需要为设置材料属性。有两种设置材料属性的方式,第一种是在指定多边形之前调用glMaterial函数。例子:
//灰色的材料属性GLfloat gray[] = {0.75f, 0.75f, 0.75f, 1.0f};glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gray);glBegin(GL_TRIANGLES);
glVertex3f(-15.0f, 0.0f, 30.0f);
glVertex3f(0.0f, 15.0f, 30.0f);
glVertex3f(0.0f, 0.0f, -56.0f);glEnd();
glMaterialfv的第一个参数是指定正面, 反面, 正面和反面。第二个参数是告诉Opengl设置哪个属性。GL_AMBIENT_AND_DIFFUSE指定环境光反射属性和漫反射属性为同一个值。最后一个参数是一个RGBA值的数组。
在绝大多数情况下,环境光和漫反射光的成分是相同的,除非需要特殊的镜面光的效果。在多边形顶点之前需要调用glMaterial函数,并设置一个包含各种颜色成分的数组。这个操作还是相当繁琐的。下面介绍一种更简单的方式
第二种方法颜色追踪较为简单。使用颜色追踪,可以通过glColor来设置材料属性。第一步启用颜色追踪
glEnable(GL_COLOR_MATERIAL);
然后通过glColorMaterial指定需要颜色追踪的材料属性。下面的例子的设置 追踪多边形正面的环境光和漫反射的材料属性。
glColorMaterial(GL_FRONT, GL_AMBIENT_ANDDIFFUSE);
下面的例子使用颜色追踪的方式重写上面的例子:
//开启颜色追踪glEnable(GL_COLOR_MATERIAL);//设置颜色追踪的材料属性以及多边形的面glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);//设置颜色glColor3f(0.75f, 0.75f, 0.75f);glBegin(GL_TRIANGLES);
glVertex3f(-15.0f, 0.0f, 30.0f);
glVertex3f(0.0f, 15.0f, 30.0f);
glVertex3f(0.0f, 0.0f, -56.0f);glEnd();
设置环境的例子:
void SetupRC(){
GLfloat ambientLight[] = {1.0f, 1.0f, 1.0f, 1.0f};
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
//设置光照模型
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);
//设置材料追踪
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glClearColor(0.0f, 0.0f, 05.f,1.0f);}
开启明亮的环境光效果:
把环境光调成原来的一半的效果:
GLfloat ambientLight[] = {0.5f, 0.5f, 0.5f, 1.0f};
完整的例子:#include "gltools.h"
// System and OpenGL Stuff// Rotation amountsstatic GLfloat xRot = 0.0f;static GLfloat yRot = 0.0f;// Called to draw scenevoid RenderScene(void){
// Clear the window with current clearing color
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Save matrix state and do the rotation
glPushMatrix();
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLES);
glVertex3f(-15.0f, 0.0f, 30.0f);
glVertex3f(15.0f, 0.0f, 30.0f);
glVertex3f(0.0f, 0.0f, 60.0f);
glColor3f(0.0f, 0.0f, 0.0f);
glVertex3f(-15.0f, 0.0f, 30.0f);
glVertex3f(0.0f, 0.0f, 60.0f);
glVertex3f(0.0f, 15.0f, 30.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 60.0f);
glVertex3f(15.0f, 0.0f, 30.0f);
glVertex3f(0.0f, 15.0f, 30.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(-15.0f, 0.0f, 30.0f);
glVertex3f(0.0f, 15.0f, 30.0f);
glVertex3f(0.0f, 0.0f, -53.0f);
glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f(0.0f, 15.0f, 30.0f);
glVertex3f(15.0f, 0.0f, 30.0f);
glVertex3f(0.0f, 0.0f, -53.0f);
glColor3f(0.5f, 0.5f, 0.3f);
glVertex3f(15.0f, 0.0f, 30.0f);
glVertex3f(-15.0f, 0.0f, 30.0f);
glVertex3f(0.0f, 0.0f, -53.0f);
glColor3f(0.3f, 1.0f, 0.2f);
glVertex3f(0.0f, 0.0f, -53.0f);
glVertex3f(0.0f, 0.0f, -70.0f);
glVertex3f(0.0f, 15.0f, -70.0f);
glColor3f(0.7f, 0.5f, 0.3f);
glVertex3f(-15.0f, 0.0f, -70.0f);
glVertex3f(0.0f, 0.0f, -53.0f);
glVertex3f(0.0f, 0.0f, -70.0f);
glColor3f(0.2f, 0.2f, 0.8f);
glVertex3f(15.0f, 0.0f, -70.0f);
glVertex3f(0.0f, 0.0f, -70.0f);
glVertex3f(0.0f, 0.0f, -53.0f);
//由于背面被消除,背面再画一次
glColor3f(0.3f, 1.0f, 0.2f);
glVertex3f(0.0f, 0.0f, -70.0f);
glVertex3f(0.0f, 0.0f, -53.0f);
glVertex3f(0.0f, 15.0f, -70.0f);
glColor3f(0.7f, 0.5f, 0.3f);
glVertex3f(0.0f, 0.0f, -53.0f);
glVertex3f(-15.0f, 0.0f, -70.0f);
glVertex3f(0.0f, 0.0f, -70.0f);
glColor3f(0.2f, 0.2f, 0.8f);
glVertex3f(0.0f, 0.0f, -70.0f);
glVertex3f(15.0f, 0.0f, -70.0f);
glVertex3f(0.0f, 0.0f, -53.0f);
glColor3ub(128,128,128);
glVertex3f(0.0f,2.0f,27.0f);
glVertex3f(-60.0f, 2.0f, -8.0f);
glVertex3f(60.0f, 2.0f, -8.0f);
glColor3ub(64,64,64);
glVertex3f(60.0f, 2.0f, -8.0f);
glVertex3f(0.0f, 7.0f, -8.0f);
glVertex3f(0.0f,2.0f,27.0f);
glColor3ub(192,192,192);
glVertex3f(60.0f, 2.0f, -8.0f);
glVertex3f(-60.0f, 2.0f, -8.0f);
glVertex3f(0.0f,7.0f,-8.0f);
glColor3ub(64,64,64);
glVertex3f(0.0f,2.0f,27.0f);
glVertex3f(0.0f, 7.0f, -8.0f);
glVertex3f(-60.0f, 2.0f, -8.0f);
glPopMatrix();
// Display the results
glutSwapBuffers();}// This function does any needed initialization on the rendering// context. void SetupRC(){
GLfloat ambientLight[] = {0.5f, 0.5f, 0.5f, 1.0f};
glEnable(GL_DEPTH_TEST);
// Hidden surface removal
glEnable(GL_CULL_FACE);
// Do not calculate inside of jet
glFrontFace(GL_CCW);
// Counter clock-wise polygons face out
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
// Nice light blue
glClearColor(0.0f, 0.0f, 05.f,1.0f);}void SpecialKeys(int key, int x, int y){
if(key == GLUT_KEY_UP)
xRot-= 5.0f;
if(key == GLUT_KEY_DOWN)
xRot += 5.0f;
if(key == GLUT_KEY_LEFT)
yRot -= 5.0f;
if(key == GLUT_KEY_RIGHT)
yRot += 5.0f;
if(key & 356.0f)
xRot = 0.0f;
if(key & -1.0f)
xRot = 355.0f;
if(key & 356.0f)
yRot = 0.0f;
if(key & -1.0f)
yRot = 355.0f;
// Refresh the Window
glutPostRedisplay();}void ChangeSize(int w, int h){
GLfloat nRange = 80.0f;
// Prevent a divide by zero
if(h == 0)
// Set Viewport to window dimensions
glViewport(0, 0, w, h);
// Reset coordinate system
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Establish clipping volume (left, right, bottom, top, near, far)
if (w &= h)
glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();}int main(int argc, char* argv[]){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800,600);
glutCreateWindow("Jet");
glutReshapeFunc(ChangeSize);
glutSpecialFunc(SpecialKeys);
glutDisplayFunc(RenderScene);
SetupRC();
glutMainLoop();
return 0;}
OpenGL超级宝典 第4版 中文版PDF+英文版+源代码 见&
OpenGL编程指南(原书第7版)中文扫描版PDF 下载
OpenGL 渲染篇
13.04 安装 OpenGL
OpenGL三维球体数据生成与绘制【附源码】
Ubuntu下OpenGL编程基础解析
如何在Ubuntu使用eclipse for c++配置OpenGL &
更多《OpenGL超级宝典学习笔记》相关知识 见&
本文永久更新链接地址:
相关资讯 & & &
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款opengl之mac下嵌入GLTools.h 求助
[问题点数:20分]
opengl之mac下嵌入GLTools.h 求助
[问题点数:20分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 opengl红宝书和蓝宝书 的文章

 

随机推荐