GLSL代码到2D地形与高度地图渲染
GLSL code to 2D terrain with height map rendering
我有一个2d贴图和图像的高度地图,我想用它来使地图看起来不那么平坦。但是我对SFML中使用的GLSL很陌生。我正在寻找一些GLSL着色器,我可以在相同的坐标上传递贴图纹理和高度地图的一部分,或者创建高度错觉。但是我自己做的一切,我没有时间学习GLSL只是为了这一个着色器,我想使用,所以感谢任何回复(最好是如果有人可以发布一些着色器代码,并解释它是如何在。cpp文件中使用的)
您可能对"视差遮挡映射"技术感兴趣。可以在这里找到一个很好的实现
这将踢屏幕上的Z给人一种高度地图的错觉。它实际上不会改变几何形状。这对于自顶向下的视图是没有用的。我会尝试添加一些基于新Z和光方向的阴影效果。
这一行:pos。Z += color。X +颜色。y + color.z;是推动z的因素。你可以给scale一个正数或负数。
/* Vertex Program
* Shifts Z by Textures color
*/
uniform sampler2D color_texture;
uniform float scale;
varying vec4 p_color;
void main()
{
vec2 texcoords = gl_MultiTexCoord0.st;
p_color = texture2D(color_texture,texcoords);
vec4 color = texture2D(color_texture,texcoords);
vec4 pos = gl_Vertex;
pos.z += color.x + color.y + color.z;
pos.z*=scale;
gl_Position = gl_ModelViewProjectionMatrix * pos;
}
这是一个非常简单的Fragment程序…
/* Fragment Program
Copies incoming fragment color without change.
*/
varying vec4 p_color;
void main()
{
gl_FragColor = p_color;
}
这将使地形网格变形为气泡/圆顶形状的基础,无论光线在世界空间中的位置。地形镶嵌得越多,效果越好。
Const Float PI = 3.1415928;
vec3 vVertex = vec3( gl_Vertex);
float d = distance(lightPos , gl_Vertex);
float d2;
if (d < 1500.0)
{
d2 = d/1500.0;
d = cos(PI*2.0*d2);
}
else
{
d=0.0;
d2=0.0;
}
vVertex.y += (d*75.0)*(1.0-d2)-50.;
gl_Position = gl_ModelViewProjectionMatrix* vec4(vVertex,gl_Vertex.w);
相关文章:
- 为什么不;名字在地图上是按顺序排列的吗
- 基于多个条件处理地图中的所有元素
- 在C++中将矢量转换为嵌套地图
- 替换基于地图的所有引用
- 如何区分地图中的 0 和 false?
- 地图计数确实很重要,或者只是检查是否存在
- 如何从地图中删除矢量对象
- 是否有任何C++功能可以对地图进行排序?
- 如何使用 std::variant 打印地图键/值?
- 从矢量或地图中删除共享指针
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 无限嵌套具有变体的地图
- C++一会儿循环读到地图上 2 行?
- 如何在cpp中使用地图显示给定日期范围内(在下面的问题中)的费率?
- 如何检查变量是否是C++中的地图?
- 如何使地图按值C++排序
- 修改地图内矢量中的值
- 为什么我在地图中搜索STL时差很大?
- OpenGL glTexImage2D 立方体地图和宽度/高度参数
- GLSL代码到2D地形与高度地图渲染