电脑游戏如何发挥作用?我将使用几何高度图(虽然我稍后会对其进行优化)但我想知道最好的技术是什么,例如,"绘制"我的地面; 到处都是草地,这里和那里的泥路,城镇内的砾石,以及每种材料之间的平滑过渡.
我只是使用一个巨大的预烘烤纹理?当我可以平铺现有纹理时,这看起来非常低效.那么我是否为每个现有纹理使用一个巨大的alpha贴图?从理论上讲,这对我来说听起来不错,但我如何实际做到这一点以及后果是什么?我真的不知道从哪里开始,我的谷歌搜索并没有证明是非常有效的.
我宁愿不必将纹理"捕捉"到网格上(即空间(0,0)是草,空间(0,2)是泥土,空间(0,1)是草土过渡); 我宁愿能够任意绘画,以使它看起来更有说服力.当然,这将是一种简单的方法,但它在图形质量和"现实主义"方面的牺牲太多了.
我主要是在这里寻找理论和选择.我正在使用OpenGL,所以如果你能提供关于OpenGL的工作方式的提示,以及我可能从未听说过的功能,那就太棒了.
只是为了澄清,Oblivion是我正在寻找的一个很好的参考.我不知道地面的几何形状(高度图,静态3D模型等),但它们的地形有不同的地面类型和它们之间的平滑过渡,就像我在说的那样.这是一个示例图像,注意鹅卵石如何融入草丛,不切实际但顺利:http://www.elitistsnob.com/images/Oblivion%202006-05-21%2008-38-25-15.jpg
另外我想我在其中一本游戏编程宝石书中读过这篇文章,但当时我并没有太注意它,现在是夏天我无法访问我大学的图书馆!我现在正在寻找目录,如果我发现它会编辑,但直到8月中旬我仍然无法阅读.
编辑:啊,游戏编程宝石7有一个标题为"为室外地形渲染绘制大纹理"的章节5.8,这听起来就像我需要的,但是我的U的图书馆甚至没有那本书!我在其他Game Programming Gems书籍中找不到任何完全相同的东西,尽管有一些人有一些地形几何文章.
我最近在OpenGL中编写了一个小型地形渲染引擎,它的功能类似于你所说的.我使用的技术最好描述为纹理喷溅.
我使用五种纹理来实现这一目标.这些纹理中有四种是细节纹理:草,岩石,水和沙子.这些纹理很小,512x512纹理,并且它们在地形上平铺.第五个纹理是mixmap.mixmap是一个覆盖整个地形的巨大纹理,在我的例子中是4096x4096.
此mixmap使用所有4个颜色通道(r,g,b,a)来描述在该特定位置显示多少细节纹理.我使用红色通道来确定沙子是多么不透明,绿色是草,蓝色是水,阿尔法是岩石.此mixmap是在初始化时根据高度图计算的,我使用高度来确定这些值.例如,靠近海平面,我主要想要水,所以我在蓝色通道中设置了较高的值,在其他通道中设置了较低的值.随着我越来越高入山区,我将alpha颜色通道设置为高值,因为我需要大量的岩石纹理,但我将所有其他颜色通道设置为较低的值.
然后在片段着色器中使用此mixmap,我在其中使用mixmap的这些颜色通道并使用它们来组合细节纹理.这是我用于片段着色器的GLSL代码:
uniform sampler2D alpha;
uniform sampler2D grass;
uniform sampler2D water;
uniform sampler2D rock;
uniform sampler2D sand;
uniform float texscale;
varying vec3 normal, lightDir ;
void main()
{
// Get the color information
vec3 alpha = texture2D( alpha, gl_TexCoord[0].st ).rgb;
vec3 texSand = texture2D( sand, gl_TexCoord[0].st * texscale ).rgb;
vec3 texGrass = texture2D( grass, gl_TexCoord[0].st * texscale ).rgb;
vec3 texWater = texture2D( water, gl_TexCoord[0].st * texscale ).rgb;
vec3 texRock = texture2D( rock, gl_TexCoord[0].st * texscale ).rgb;
// Mix the colors together
texSand *= mixmap.r;
texGrass = mix(texSand, texGrass, mixmap.g);
texWater = mix(texGrass, texWater, mixmap.b);
vec3 tx = mix(texWater, texRock, mixmap.a);
// Lighting calculations
vec3 dl = gl_LightSource[0].diffuse.rgb;
vec3 al = gl_LightSource[0].ambient.rgb;
vec3 n = normalize(normal);
vec3 d = tx * (dl * max( dot ( n, lightDir), 0.0 ) + al );
// Apply the lighting to the final color
vec4 finalColor = vec4( min(d, 1.0), 1.0);
gl_FragColor = mix(gl_Fog.color, finalColor, fogFactor);
}
Run Code Online (Sandbox Code Playgroud)
统一texscale是一个值,用于确定细节纹理在地形上平铺的次数.较高的值会使细节纹理看起来更清晰,有可能使它们看起来更重复.