1

我正在尝试使用着色器脚本渲染随机地形

创建函数..

tex = new Texture(Gdx.files.internal("ground.png"));
top = new Texture(Gdx.files.internal("top.png"));
ShaderProgram.pedantic = false;
shader = new ShaderProgram(VERT, FRAG);
shader.begin();
shader.setUniformi("u_top", 1);
shader.end();
top.bind(1);
Gdx.gl.glActiveTexture(GL10.GL_TEXTURE0);
batch = new SpriteBatch(1000, shader);
batch.setShader(shader);

渲染功能

batch.begin();
for (int i = 0; i < 4; i++)
    batch.draw(tex, i * 256 * Initiate.getScale(), 0,
                        256 * Initiate.getScale(), 256 * Initiate.getScale());
batch.end();

顶点着色器

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;

uniform mat4 u_projTrans;

varying vec4 vColor;
varying vec2 vTexCoord;

void main()
{
    vTexCoord = a_texCoord0;
    gl_Position =  u_projTrans * a_position;
}

片段着色器

#ifdef GL_ES
#define LOWP lowp
precision mediump float;
#else
#define LOWP 
#endif

varying LOWP vec4 vColor;
varying vec2 vTexCoord;

uniform sampler2D u_texture1;
uniform sampler2D u_texture2;



 void main() 
    vec4 texColor ;
//calculate top vertex 
    float clamp = 0.5 + slope*(sin(vTexCoord0.x*mfrq)/mfrq+sin(vTexCoord0.x*frq)/frq+sin(vTexCoord0.x*nfrq)/nfrq);
//if larger the draw texture
    if(vTexCoord0.y > clamp){
      texColor = texture2D(u_texture1, vTexCoord1);
    }


 // else map coordinate for top texture and draw 
        else{
        float tempy = 16.0*(vTexCoord0.y + 0.0625- clamp);
        texColor = texture2D(u_texture2, vec2 (vTexCoord1.x,tempy));
        }
        gl_FragColor = texColor;

输出

图片

所以问题是..

  • 如何在这个地形的顶部添加纹理?
  • 有什么简单的方法可以重新绘制这样的地形吗?
4

1 回答 1

1

您可以通过计算两个参数在片段着色器中执行此操作 - 沿地形表面的距离和垂直于表面的深度,这可以通过属性完成或在顶点着色器中计算,具体取决于您生成地形的方式,然后只需基于纹理进行采样在这两个坐标上,沿第一个坐标平铺。

沿表面的距离只是形成表面的边的总长度。深度可以计算为从顶点到曲面边缘的距离,插值将为您提供整个多边形的近似深度。四边形应该给你比三角形更好的插值。

于 2013-07-09T08:59:44.213 回答