- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
电脑游戏如何呈现其阵地?我将使用几何高度图(尽管我稍后会对其进行优化),但我想知道最好的技术是什么,例如,“绘制”我的地面;到处都是草,到处都是土路,城镇里有砾石,每种 Material 之间都有平滑的过渡。
我只使用巨大的预烘焙纹理吗?当我可以平铺现有纹理时,这似乎非常低效。那么我是否要为每个现有纹理使用巨大的 alpha 贴图?从理论上讲,这对我来说听起来不错,但我实际上该如何去做以及后果是什么?我真的不知道从哪里开始,而且我的 Google 搜索也没有被证明非常有效。
我不想将纹理“捕捉”到网格(即空间(0,0)是草,空间(0,2)是泥土,空间(0,1)是草-泥土过渡) ;我宁愿能够随意画画,这样看起来更有说服力。当然,这是一种简单的方法,但在图形质量和“真实感”方面牺牲太多。
我主要只是在这里寻找理论和选择。我正在使用 OpenGL,因此如果您能提供有关 OpenGL 的工作方式以及我可能从未听说过的功能的提示,那就太好了。
只是为了澄清一下,《Oblivion》是我正在寻找的内容的一个很好的引用。我不知道地面的几何形状(高度图、静态 3D 模型等),但它们的地形具有不同的地面类型以及它们之间的平滑过渡,就像我所说的那样。这是一个示例图像,请注意鹅卵石如何融入草地,不切实际但顺利:http://www.elitistsnob.com/images/Oblivion%202006-05-21%2008-38-25-15.jpg
另外,我想我在一本《游戏编程 gem 》书中读到过这一点,但当时我并没有太注意它,而且现在是夏天,我无法访问我大学的图书馆来查看!我现在正在寻找目录,如果找到就会进行编辑,但直到八月中旬我仍然无法阅读它。
编辑:啊,游戏编程 gem 7 有一个章节 5.8,标题为“为户外地形渲染映射大型纹理”,这听起来正是我所需要的,但我的大学图书馆甚至没有那本书!我在其他游戏编程 gem 书籍中找不到与此完全相同的内容,尽管有一些关于地形几何的文章。
最佳答案
我最近用 OpenGL 编写了一个小型地形渲染引擎,它的功能与您所说的类似。我使用的技术最好描述为 texture splatting .
我使用五个纹理来完成此任务。其中四种纹理是细节纹理:草、岩石、水和沙子。这些纹理较小,为 512x512 纹理,并且平铺在地形上。第五个纹理是混合贴图。混合贴图是一个覆盖整个地形的巨大纹理,在我的例子中是 4096x4096。
此混合贴图使用所有 4 个颜色 channel (r、g、b、a)来描述在该特定位置显示多少细节纹理。我使用红色 channel 来确定沙子的不透明程度,绿色代表草,蓝色代表水,Alpha 代表岩石。该混合贴图是根据初始化时的高度图计算的,我使用高度来确定这些值。例如,靠近海平面,我主要想要水,所以我在蓝色 channel 中设置较高的值,在其他 channel 中设置较低的值。当我进入山的更高处时,我将 Alpha 颜色 channel 设置为较高的值,因为我想要大量的岩石纹理,但我将所有其他颜色 channel 设置为较低的值。
然后将该混合贴图在片段着色器中使用,我在其中获取混合贴图的这些颜色 channel 并使用它们来组合细节纹理。以下是我用于片段着色器的 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);
}
统一纹理比例是一个值,用于确定细节纹理在地形上平铺的次数。较高的值将使细节纹理看起来更清晰,但有可能使它们看起来更重复。
关于opengl - 多个纹理图像混合到 3D 地面上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1110844/
我想做同样的事情:(没有复制球体) http://people.mozilla.org/~sicking/webgl/ray.html 我做到了,它有效,但反射太大:/ var groundTextu
我知道做水平和垂直卷轴游戏(如马里奥),在这种游戏类型中,角色与用户的距离始终相同。字符仅在水平滚动条中左右移动,在垂直滚动条中上下移动。 但有些 2D 游戏中的角色可以在场景中自由移动,例如图形冒险
如何从 bigcommerce API(Ground、Express)获取订单“运输方式”? 客户下单时选择的送货方式。 谢谢 最佳答案 请参阅此 page , 获取特定订单的运输相关数据。 关于bi
我需要一个 C# 函数来执行以下操作:从 gps 点 A 向 gps 点 B 的方向移动 50 米,并计算该点的 GPS 坐标。 例如我有两个坐标: LatLon LatLonA = new LatL
我是一名优秀的程序员,十分优秀!