我有以下格式的2D高度图
06 36 39 42 43 55 ...
37 40 43 43 45 46 ...
40 43 44 45 46 48 ...
44 44 46 47 48 50 ...
41 44 45 47 48 48 ...
...
Run Code Online (Sandbox Code Playgroud)
我需要将其重新映射为基于grin的轮廓格式(因此它可以进一步映射到精灵)
. . . . | . .
. . . . \ . .
. . . / / . .
. . . | . . .
. . . | . . .
. / - / . . . …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用WebGL创建3D地形.我有一个带有地形纹理的jpg,另一个带有高度值(-1到1)的jpg.
我看过各种包装器库(比如SpiderGL和Three.js),但我找不到一个可变的例子,如果我这样做(比如在Three.js中)代码没有记录,我也想不通怎么做.
任何人都可以给我一个很好的教程或例子吗?
有一个在three.js所为例http://mrdoob.github.com/three.js/examples/webgl_geometry_terrain.html这是我想要什么差不多.问题是他们随机创造了山脉的颜色和高度值.我想从2个不同的图像文件中读取这些值.
任何帮助都会得到满足.谢谢
我正在从加载的高度图数据渲染基于点的地形 - 但这些点会根据摄影机位置的位置更改其纹理.为了演示这个错误(以及这不是因为z缓冲问题而发生的事实)我已经截取了从非常微小的不同摄像机位置(相同的角度)以固定的5像素大小渲染的点的截图,如下所示:
PS:如果将图像拖动到新标签中,图像足够大,没有意识到堆栈会将它们缩小到这么多.
州1:

州2:

生成点的代码相对简单,所以我发布这个只是为了排除选项 - mapArray是一个单维浮点数组并复制到VBO:
for(j = 0; j < mHeight; j++)
{
for(i = 0; i < mWidth; i++)
{
height = bitmapImage[k];
mapArray[k++] = 5 * i;
mapArray[k++] = height;
mapArray[k++] = 5 * j;
}
}
Run Code Online (Sandbox Code Playgroud)
我发现我更有可能需要调整我的片段着色器,因为我对着色器并不是很好 - 虽然我不确定这些简单代码在哪里出错但猜测它可能不适合用途(基于点渲染).贝娄是我的碎片着色器:
in varying vec2 TexCoordA;
uniform sampler2D myTextureSampler;
void main(){
gl_FragColor = texture2D(myTextureSampler, TexCoordA.st) * gl_Color;
}
Run Code Online (Sandbox Code Playgroud)
编辑(请求的信息):OpenGL版本4.4没有使用纹理标志.
TexCoordA直接从我的Vertex着色器传递到着色器,完全没有任何改动.自我计算的紫外线使用这个:
float* UVs = new float[mNumberPoints * 2];
k = 0;
for(j = 0; j < mHeight; …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种近似在高度图上移动的流体体积的方法.我能想到的最简单的解决方案是将其近似为大量直径小(<0.1m)的非绘制球体.然后,我会在它们停下来的位置放置一个可见的平面,代表水面"水面".据我所知,没有托管物理引擎包含内置流体模拟器,因此问题.
实现将包括使用物理引擎,如JigLibX,它能够模拟球体的运动.为了确定平面的高度,我想到平均分组顶层每个球体的最大高度.
我不希望性能很好,但实时可以接近吗?如果没有,我可以使用此模拟预先烘烤流线吗?
我希望这是有道理的,我真的希望得到关于这是否可行的意见/建议,或者是否有更好的方法来解决这个问题.
感谢任何帮助,Venatu
(如果它的相关,我的目标平台是XNA 4.0,使用C#.Windows只在这个时间点,所以PhysX/Havok是模拟的可能性,但我更喜欢托管解决方案)
我目前正在用 JavaScript、Three.js 开发一款游戏。我很好奇是否可以在墙上添加高度图,以使它们更加真实(见图)。带有 2D 墙的游戏设计图像。
我见过的所有教程都使用平面而不是矩形。我目前正在使用矩形,并且不想切换,但如果没有矩形的解决方案,我会很高兴知道。
我目前正在使用类 NewObstacle() 来制作我的矩形:
const wallTexture = new THREE.TextureLoader();
const wallTextureTexture = new THREE.MeshBasicMaterial({
map: wallTexture.load('wall_textures/wall_3.jfif')
})
class NewObstacle{
constructor(sizeX, sizeY, sizeZ, xPos, yPos, zPos){
this.sizeX = sizeX
this.sizeY = sizeY
this.sizeZ = sizeZ
this.xPos = xPos
this.yPos = yPos
this.zPos = zPos
}
makeCube(){
const cubeGeometry = new THREE.BoxGeometry(this.sizeX, this.sizeY, this.sizeZ)
this.box = new THREE.Mesh(cubeGeometry, /*new THREE.MeshBasicMaterial({color:
0x505050})*/wallTextureTexture)
this.box.material.transparent = true
this.box.material.opacity = 1
this.box.position.x = this.xPos
this.box.position.y = this.yPos
this.box.position.z = …Run Code Online (Sandbox Code Playgroud)我在OpenGL中实现了一个高度图.现在它只是一个正弦/余弦弯曲的地形.此刻,我在白色"冰"和深色"石头"纹理之间进行插值.这样做是这样的:
color = mix(texture2D(ice_layer_tex, texcoord), texture2D(stone_layer_tex, texcoord), (vertex.y + amplitude) / (amplitude * 2))
Run Code Online (Sandbox Code Playgroud)
结果:


它工作正常,但如果我想添加更多纹理(例如草纹理),插值顺序为"冰,石头,草",我该怎么办?我想,有没有这样的功能mix(sampler2D[], percentages[])?我怎么能按照这个逻辑写一个GLSL方法?
我创建了一个类来从高度图文件中加载Terrain点; 但绘制它们会导致崩溃.我已经将错误缩小到glVertexPointer()函数,该函数返回1281(无效值导致我相信).我已经通过了完整的65k-ish点,似乎无法找到它的问题.在渲染循环中之前发生的唯一其他事情是设置GL_PROJECTION和GL_MODELVIEW以及glClear()(显然是在这个绘制调用之后的交换缓冲区).
class Terrain : public Model
{
public:
Terrain(char* pFile){
if(!LoadTerrain(pFile))
{
OutputDebugString("Loading terain failed.\n");
}
};
~Terrain(){};
void Draw()
{
glPushMatrix();
//glEnableClientState(GL_VERTEX_ARRAY); // Depreciated? Causes crash
glBindBuffer(GL_ARRAY_BUFFER, mVBO);
glVertexPointer(mNumberPoints, GL_FLOAT, 0, (GLvoid*)((char*)NULL));
GLenum a = glGetError(); // 1281
glPointSize(5.0f);
glDrawArrays(GL_POINTS, 0, mNumberPoints);
glBindBuffer(GL_ARRAY_BUFFER, 0);
//glDisableClientState(GL_VERTEX_ARRAY);
glPopMatrix();
}
private:
GLuint mVBO;
int mWidth;
int mHeight;
int mNumberPoints;
bool LoadTerrain(char* pFile)
{
FILE* filePtr;
int error;
unsigned int count;
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
int imageSize, i, j, k, index;
unsigned …Run Code Online (Sandbox Code Playgroud) 我正在尝试将浮点值(高度图)数组作为GL_TEXTURE_2D发送到GLSL。当我设置好采样器后,问题出在使用glTexImage2D()上传纹理时发生的钳位。
glGenTextures(1, &_idnewTID);
glBindTexture(GL_TEXTURE_2D, _idnewTID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, regMesh._cols, regMesh._rows, 0, GL_RED, GL_FLOAT, regMesh._heightMap);
Run Code Online (Sandbox Code Playgroud)
我要发送的值在900.0f至1590.0f范围内。但这在加载到时会被完全钳制到1.0f GL_TEXTURE_2D。
如何保持值不被钳制到[0,1]。如何修改glTexImage2D()函数以实现此目标?
PS我知道采样器工作正常,因为当我将值除以1500.0f并将其上载到GPU并在着色器中缩放时,我得到了正确的高度图结构。
我有一个程序,该程序生成一个高度图(0到255之间的2D整数数组),并使用Shape3D“ Box”对象为每个“像素”建立一个3D视图,其高度与其在高度图中的值成比例。这将创建一个看上去很酷的四方形外观。我的程序还创建了一个相应的“颜色图”,以映射地形中每个框应具有的颜色。
我还希望能够将此高度图转换为可以使用颜色图进行纹理处理的网格。
2D高度和颜色图

从高度图和颜色图创建的彩色三角形网格

(这些是我从Google抓取的图片)
我想创建一个世界生成器,这样每次加载它时,它都会生成一个新的高度图.为此,我使用2D整数数组.尺寸是x,z和高度(y).
是否有一些简单的生成算法可以随机化地形?
这个问题必须存在于某个地方,但我不确定它会被称为什么.
在高度图之后,存在直角三角形的地形.每个三角形的每个点从高度图中获取其高度(y).
如果角色位于特定的坐标集上,您可以确定它们所处的三角形.我忘记怎么做是通过使用其他3个点的高度来确定三角形上该点的高度.
我是3D游戏编程的新手,现在正在Windows上研究DirectX和OpenGL.但我想出了一个地形编辑器,但我无法在网上获得任何开放的教程或想法.
有没有一个很好的教程或开源代码来学习这个?
简单的一个很好,我只是想知道如何提升或降低地形,或在地图上放一棵树,如下面的视频.