- 博客(24)
- 资源 (1)
- 收藏
- 关注
原创 KEngine KCamera
在写camera之前要确定camera要实现那些功能。camera的基本功能有:forward,back,left,right,up,down,turn left,turn rifht,turn up, turn down.这些功能都可以通过glLookAt函数来实现,glLookAt的前三个参数表示视点的位置,随后的三个参数表示要看的位置,最后三个参数表示哪个轴是表示向上。文中是另外一种实现
2010-04-15 12:44:00
404
原创 KEngine KBmpFont
位图字体也就是将字符保存在位图中,同样是为每个字符构造一个显示列表,显示列表中绘制个四边形并贴上代表每个字符的位图。这样每次调用显示列表的时候也就是在3d空间中绘制了一个基本图形。通过glBlendFunc(GL_ONE, GL_ONE), glEnable(GL_BLEND),启动混合将纹理的黑色背景去掉。因为绘制的是一个基本图形,参与深度测试,所以要关掉深度测试,glDisable(GL_DE
2010-04-15 09:56:00
367
原创 kengine2 glCallLists
GLuint index = glGenLists(10); // create 10 display listsGLubyte lists[10]; // allow maximum 10 lists to be renderedglNewList(index, GL_COMPILE); // compile the first one...g
2010-04-15 09:27:00
735
原创 kengine
从今天开始,我将每天用一个小时分析KEngine,一个3d引擎。由于第一次对一个引擎进行分析,将按文件在程序中的组织顺序逐个文件进行分析。首先是KBMPFont类文件。文中使用显示列表来创建位图字体,共产生256个显示列表,对应char类型所代表的所有字符。首先通过CreateFont创建字体。通过SelectObject为HDC选择字体。ascii基本可视集从十进制32开始.用wglUseF
2010-04-15 09:24:00
993
原创 加载纹理
MakeTexture(); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glGenTextures(1, &texName); glBindTexture(GL_TEXTURE_2D, texName); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WIDTH, WIDTH, 0, GL_RGBA, GL_UNSIGNED_B
2010-03-20 12:32:00
465
原创 glBengin 与 glEnd位置不同导致的不同结果
for(int i = 0; i { glPushMatrix(); glTranslatef(fire.x, fire.y, 0.0f); glRotatef(fire.fp[i].dir, 0.0f, 0.0f, 1.0f); glColor3f(fire.fp[i].r, fire.fp[i].g, fire.fp[i].b); glBegin(GL_POINTS); gl
2010-03-16 16:18:00
565
原创 水波三
case WM_LBUTTONDOWN: { int x,z; float dx,dz; xpos = LOWORD(lParam); // horizontal position of cursor ypos = HIWORD(lParam); // vertical position of cursor dx=(float)fx/DIMX; dz=(float
2010-03-11 16:26:00
417
原创 水波二
void Wave(void){ int i,j; float d; for(i=0; i for(j=0; j force[i][j] = 0.0f; for(i=1; i for(j=1; j { d=surf[i][j][1]-surf[i][j-1][1]; force[i][j] -= d; force[i][j-1] += d; d=surf[i][j][1]-s
2010-03-11 16:18:00
288
原创 水波
/* h = A*sin(2*pi*W*t)*/ int dx, dy; /* Disturbance Point */ float s, v, W, t; int i, j; dx = WSIZE >> 1; dy = WSIZE >> 1; W = 0.3; v = -4; /* Wave speed */ for (i=0; i for (j=0; j
2010-03-11 14:08:00
492
原创 碰撞检测
float D0; float D1; D0 = g_vSpherePos.DotProduct(g_sQuads[i].vNormal) - g_sQuads[i].D; // before movement D1 = g_vSphereAfter.DotProduct(g_sQuads[i].vNormal) - g_sQuads[i].D; // after movement
2010-03-11 11:54:00
264
原创 限制帧频
Time2 = TimerGetTime()/1000; DiffTime = ABS(Time2-Time1); while (DiffTime { Sleep(1); Time2 = TimerGetTime()/1000; DiffTime = ABS(Time2-Time1); } Time1 = TimerGetTim
2010-03-10 16:49:00
367
原创 noise
float a, b, length, alpha; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); // Disable depth buffer filling glDepthMask(GL_FALSE); // Start drawing our random lines (polygons
2010-03-10 15:11:00
400
原创 花瓶
int x,y; float rg=2,an=0; float xf,yf,zf,dan=(float)366/BUFDX; // Init the array for the Vase for(y=0;y { rg=rg+(cos((double)an*3.141/180)+sin((double)an*3.141/180)+cos((double)an*6.141/180)*sin((do
2010-03-10 09:48:00
361
原创 特效之火
Vector Colore(float col) // Calculate the color for the fire effect{ int ki; Vector kf; ki=(int)(col*256); if(ki { kf.x=(float)ki/2; kf.y=(float)ki/4; kf.z=0; } else { if(ki { kf.x=(float)ki/
2010-03-09 10:28:00
362
原创 loading 特效
float ColorePannello(float k){ // Calculates the color of the loading panel (the moving white light) k=1-k/var.fattpannello;//var.fattpannello是逐渐减小的,也就是说对于同一个传进来的参数k,返回值逐渐减小。也就是偏于0.
2010-03-09 09:23:00
235
原创 设置透明度
设置带纹理的物体的透明度有两种方式:1,使用glColor4f();通过设置alpha分量改变物体的透明度。2,通过设置纹理的alpha分量改变纹理的透明度。如果纹理没有alpha分量,通过函数添加alpha分量。 int CTexture::AddAlphaLayer(unsigned char alpha) // 0 - 255{ // Alloc memory unsig
2010-03-08 14:18:00
600
原创 关照 法线
一直以来有个问题,就是在绘制物体的时候在启用光照的情况下感觉光照的位置跟着物体改变,今天终于知道这是因为没有设置法线的问题。所以,在绘制多边形时最好指定其法线,这样才能更好的表现光照和材质效果,如果未指定法线,一种情况会是如果窗口最小化,之后还原,多边形的颜色将会发生意想不到的情况。如果指定法线,在球体中指定关照材质的情况下将会表现出真实的效果。
2010-03-08 11:25:00
274
原创 antialiasing
反走样一般的方法如下:glEnable(GL_LINE_SMOOTH);glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);glLineWidth(num);
2010-03-08 10:46:00
442
原创 光照
实现隐藏面消除的最好方法是使用深度缓冲区。深度缓冲区的原理就是把一个距离观察平面的深度值与窗口中的每个像素相关联。一开始,以GL_DEPTH_BUFFER_BIT为参数使用glClear()函数,把所有像素的深度值设置为最大可能的距离。随后,在场景中以任意顺序绘制所有的物体。硬件或软件所执行的图形计算把每个被绘制的表面转换为窗口上一些像素的集合,此时并不考虑他们是否会被其他物体所遮挡。此外,还要计
2009-11-21 12:56:00
388
原创 windows ce 嵌入式系统读书笔记(一)
引导程序BootLoader是在硬件开发板上执行的一段代码,它的主要功能是初始化硬件,加载操作系统映像到内存,然后跳转到操作系统代码去执行。BootLoader可通过串口、usb、以太网下载;BootLoader也可以从本地的存储设备,例如cf卡和硬盘中读取操作系统映像。当BootLoader得到操作系统映像后,它可把操作系统映像存放到内存里或者本地的存储设备中以便以后使用。当引导程序引导操作系
2009-09-22 13:54:00
670
原创 初始化
无论是局部变量还是全局变量一定要初始化。最近在写数据库以及使用wm_copydata在进程间传递数据时因为没有对变量进行初始化而出现了莫名其妙的错误,导致不能添加多一点代码,这些后来添加的代码跟数据库操作无任何关系,一旦添加这些代码,数据库便不可用无法添加数据,当对变量进行初始化后,一切正常。在opengles中当使用了某种状态而以后又不使用这种状态的话一定要关掉,如果不关掉也会出现非预料
2009-09-16 11:28:00
257
原创 小总
opengl是一个状态机,状态机的意思就是只要打开某种状态(使用glEnable()打开),后面将一直使用这种状态,知道调用glDisable()关闭状态。每种状态都有相应的初始化的过程,比如光照,设置环境光,漫反射光,镜面反射光等,这些工作可以在初始化opengl的时候进行,但直到调用glEnable(GL_LIGHTING),才可以使用关照,也就是说什么时候想用了,如果已经进行了初始化,只需在
2009-08-31 17:48:00
356
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人