亲密接触VC6.0编译器
[ 2006-01-28 17:00:32 | 作者: Admin ]
大家可能一直在用VC开发软件,但是对于这个编译器却未必很了解。原因是多方面的。大多数情况下,我们只停留在“使用”它,而不会想去“了解”它。因为它只是一个工具,我们宁可把更多的精力放在C++语言和软件设计上。我们习惯于这样一种“模式”:建立一个项目,然后写代码,然后编译,反反复复调试。但是,所谓:“公欲善其事,必先利其器”。如果我们精于VC开发环境,我们是不是能够做得更加游刃有余呢?
闲话少说。我们先来看一下VC的处理流程,大致分为两步:编译和连接。源文件通过编译生成了.obj文件;所有.obj文件和.lib文件通过连接生成.exe文件或.dll文件。下面,我们分别讨论这两个步骤的一些细节。
编译参数的设置。主要通过VC的菜单项Project->Settings->C/C++页来完成。我们可以看到这一页的最下面Project Options中的内容,一般如下:
...
阅读全文...
闲话少说。我们先来看一下VC的处理流程,大致分为两步:编译和连接。源文件通过编译生成了.obj文件;所有.obj文件和.lib文件通过连接生成.exe文件或.dll文件。下面,我们分别讨论这两个步骤的一些细节。
编译参数的设置。主要通过VC的菜单项Project->Settings->C/C++页来完成。我们可以看到这一页的最下面Project Options中的内容,一般如下:
...
阅读全文...
光线追踪软阴影(RayTrace SoftShadow)
[ 2006-01-28 12:47:06 | 作者: Admin ]
演示截图:
看到Humus的一个光线追踪DEMO,也自己做了一个。
但效率和他差了一大截,他实现了7个球的光线追踪,在我的FX5200上
还有12FPS的效率。
可是我,本想也做7个球,发现怎么优化速度也跟不上,结果只能降低要求,改成3个球的光线追踪,但也只有10FPS。
球是最对称的形体,在光线追踪中就许多计算上可以优化的地方, 所以实时渲染才能实现。
最关键就是找到阴影柔和变化的插值变化,
首先根据球的半径和光源向量求出阴影区域,凡是在区域内的像素的颜色值,都被乘以一个小于零的系数,使区域颜色变暗。
在pixel shader遍例每个球,计算出区域范围,通过pixel shader的每个像素都这样处理一编,即生成Shadow.
演示下载:
[file=uploads/200...
阅读全文...
看到Humus的一个光线追踪DEMO,也自己做了一个。
但效率和他差了一大截,他实现了7个球的光线追踪,在我的FX5200上
还有12FPS的效率。
可是我,本想也做7个球,发现怎么优化速度也跟不上,结果只能降低要求,改成3个球的光线追踪,但也只有10FPS。
球是最对称的形体,在光线追踪中就许多计算上可以优化的地方, 所以实时渲染才能实现。
最关键就是找到阴影柔和变化的插值变化,
首先根据球的半径和光源向量求出阴影区域,凡是在区域内的像素的颜色值,都被乘以一个小于零的系数,使区域颜色变暗。
在pixel shader遍例每个球,计算出区域范围,通过pixel shader的每个像素都这样处理一编,即生成Shadow.
演示下载:
[file=uploads/200...
阅读全文...
OpenGL版本与OpenGL扩展机制
[ 2006-01-26 22:51:49 | 作者: Admin ]
OpenGL版本比较
1 opengl的版本区别(在opengl官方文档中有详细说明)
针对Opengl不同版本的升级是主要是扩展指令集。
1.1 opengl1.1
1995年,SGI推出了更为完善的OpenGL 1.1版本。OpenGL 1.1的性能比1.0版提高甚多。其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。
1.2 opengl1.3
2001年8月,ARB发布OpenGL 1.3规范,它增加了立方纹理贴图、纹理环境、多重采样、纹理框架压缩等扩展指令,但是改进程度非常有限。
1.3 opengl1.4
2002年7月,ARB正式发布OpenGL 1.4,它也只加入了深度纹理/阴影纹理、顶点设计框架、自动纹理贴图等简单的功能。
...
阅读全文...
1 opengl的版本区别(在opengl官方文档中有详细说明)
针对Opengl不同版本的升级是主要是扩展指令集。
1.1 opengl1.1
1995年,SGI推出了更为完善的OpenGL 1.1版本。OpenGL 1.1的性能比1.0版提高甚多。其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。
1.2 opengl1.3
2001年8月,ARB发布OpenGL 1.3规范,它增加了立方纹理贴图、纹理环境、多重采样、纹理框架压缩等扩展指令,但是改进程度非常有限。
1.3 opengl1.4
2002年7月,ARB正式发布OpenGL 1.4,它也只加入了深度纹理/阴影纹理、顶点设计框架、自动纹理贴图等简单的功能。
...
阅读全文...
解析#pragma指令
[ 2006-01-26 22:36:47 | 作者: Admin ]
转自CSDN
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
其格式一般为: #Pragma Para
其中Para 为参数,下面来看一些常用的参数。
(1)message 参数。 Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗
口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:
#Pragma message(“消息文本”)
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们...
阅读全文...
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
其格式一般为: #Pragma Para
其中Para 为参数,下面来看一些常用的参数。
(1)message 参数。 Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗
口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:
#Pragma message(“消息文本”)
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们...
阅读全文...
快速平方根(平方根倒数)算法
[ 2006-01-24 18:22:25 | 作者: Admin ]
转自 http://bbs.gameres.com/showthread.asp?threadid=46513
日前在书上看到一段使用多项式逼近计算平方根的代码,至今都没搞明白作者是怎样推算出那个公式的。但在尝试解决问题的过程中,学到了不少东西,于是便有了这篇心得,写出来和大家共享。其中有错漏的地方,还请大家多多指教。
的确,正如许多人所说的那样,现在有有FPU,有3DNow,有SIMD,讨论软件算法好像不合时宜。关于sqrt的话题其实早在2003年便已在 GameDev.net上得到了广泛的讨论(可见我实在非常火星了,当然不排除还有其他尚在冥王星的人,嘿嘿)。而尝试探究该话题则完全是出于本人的兴趣和好奇心(换句话说就是无知)。
我只是个beginner,所以这种大是大非的问题我也说不清楚(在GameDev.net上也有很多类似的争论)。但无论如何,Carmack在DOOM3中还是使...
阅读全文...
日前在书上看到一段使用多项式逼近计算平方根的代码,至今都没搞明白作者是怎样推算出那个公式的。但在尝试解决问题的过程中,学到了不少东西,于是便有了这篇心得,写出来和大家共享。其中有错漏的地方,还请大家多多指教。
的确,正如许多人所说的那样,现在有有FPU,有3DNow,有SIMD,讨论软件算法好像不合时宜。关于sqrt的话题其实早在2003年便已在 GameDev.net上得到了广泛的讨论(可见我实在非常火星了,当然不排除还有其他尚在冥王星的人,嘿嘿)。而尝试探究该话题则完全是出于本人的兴趣和好奇心(换句话说就是无知)。
我只是个beginner,所以这种大是大非的问题我也说不清楚(在GameDev.net上也有很多类似的争论)。但无论如何,Carmack在DOOM3中还是使...
阅读全文...
近似计算向量长度的算法
[ 2006-01-21 12:09:01 | 作者: Admin ]
代码如下,有两个,前者计算2D向量的长度,后者计算3D向量的长度,从《3D游戏编程大师技巧》上抄下来的。
阅读全文...
int Fast_Distance_2D(int x, int y)
{
// this function computes the distance from 0,0 to x,y with 3.5% error
// first compute the absolute value of x,y
x = abs(x);
y = abs(y);
// compute the minimum of x,y
int mn = MIN(x,y);
// return the distance
return(x+y-(mn>>1)-(mn>>2)+(mn>>4));
} // end Fast_Distance_2D
[code][/code]...{
// this function computes the distance from 0,0 to x,y with 3.5% error
// first compute the absolute value of x,y
x = abs(x);
y = abs(y);
// compute the minimum of x,y
int mn = MIN(x,y);
// return the distance
return(x+y-(mn>>1)-(mn>>2)+(mn>>4));
} // end Fast_Distance_2D
阅读全文...
转自:http://www.gameres.com/bbs/showthread.asp?threadid=39493
找到两篇介绍RLE算法的文章,结合着看,理解了这个算法的目的是压缩重复的字节。大量应用在图形压缩上的原因,是因为图片中通常有很多相同颜色的区域(比如一片全黑的背景)。
RLE的基本思路是,把数据分两种情况对待:
A1.一些连续的重复字节
A2.一些连续的,不相重复的字节
RLE压缩最常见的一种算法思路:
将全部的数据分成很多块,这些块的长度各不一样:
all data = [block] + [block] + ... + [block]
每一块由两部分顺序组成:
a block = [header] + [data]
其中header部分占2字节16位,这16位中的最高位,标志了这个block的属性,是属于上面的A1还是A2。对应于A1和A2,剩下的15位以及后面的Data部分的意义又分为两种:
...
阅读全文...
找到两篇介绍RLE算法的文章,结合着看,理解了这个算法的目的是压缩重复的字节。大量应用在图形压缩上的原因,是因为图片中通常有很多相同颜色的区域(比如一片全黑的背景)。
RLE的基本思路是,把数据分两种情况对待:
A1.一些连续的重复字节
A2.一些连续的,不相重复的字节
RLE压缩最常见的一种算法思路:
将全部的数据分成很多块,这些块的长度各不一样:
all data = [block] + [block] + ... + [block]
每一块由两部分顺序组成:
a block = [header] + [data]
其中header部分占2字节16位,这16位中的最高位,标志了这个block的属性,是属于上面的A1还是A2。对应于A1和A2,剩下的15位以及后面的Data部分的意义又分为两种:
...
阅读全文...
逐象素的Spot Light的实现
[ 2006-01-14 19:57:18 | 作者: Admin ]
先得到象素到光源的向量, 与光源方向, 求夹角, 然后在平滑的插值作为强度了返回,
CG代码如下:
float InSpot(float3 LightPos,
float3 LightVec,
float3 PixelPos)
{
float3 vec1 = normalize(PixelPos - LightPos);
float cosangle = dot(LightVec, vec1);
return smoothstep(0.707f, 1.0f, cosangle);
}
float3 LightVec,
float3 PixelPos)
{
float3 vec1 = normalize(PixelPos - LightPos);
float cosangle = dot(LightVec, vec1);
return smoothstep(0.707f, 1.0f, cosangle);
}
使用时,这样处理
color.xyz = (emissive + ambient + diffuse +
...阅读全文...
乱写的一个,多物体的动态反射和折射
[ 2006-01-12 23:09:45 | 作者: Admin ]
原文来自:
http://blog.gameres.com/thread.asp?BlogID=155&threadid=20286
//判断操作系统版本
#include <windows.h>
/*++------------------------------------------------------------------------
Function:
IsWin9x
Modification History:
Jurassic 03/17/2003 Created.
--------------------------------------------------------------------------*/
bool
__stdcall
IsWin9x(
void
)
{
OSVERSIONINFO VerInfo;...
阅读全文...
http://blog.gameres.com/thread.asp?BlogID=155&threadid=20286
//判断操作系统版本
#include <windows.h>
/*++------------------------------------------------------------------------
Function:
IsWin9x
Modification History:
Jurassic 03/17/2003 Created.
--------------------------------------------------------------------------*/
bool
__stdcall
IsWin9x(
void
)
{
OSVERSIONINFO VerInfo;
阅读全文...














