2013-07-09 4 views
1

Я пытаюсь сделать случайный рельеф местности, используя шейдерные скрипты2d поколения местности с использованием шейдеров

Создать функцию ..

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(); 

Vertex Shader

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; 
} 

Fragme нт шейдер

#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; 

Выход

Image

Таким образом, вопрос ..

  • Как добавить текстуру в верхней части этой местности?
  • Есть ли какой-либо простой способ снести такой ландшафт?
+0

Где ваши директивы '# version'? – genpfault

ответ

1

Вы можете сделать это в пиксельный шейдер путем расчета два параметра - расстояние вдоль поверхности местности и глубину перпендикулярно к поверхности, это может быть сделано с помощью атрибутов или рассчитываются в вершинном шейдере, в зависимости от того, как вы создаете вы местность, затем просто прорисуйте свою текстуру, основанную на этих двух координатах, с черепицей вдоль первой координаты.

Расстояние по поверхности - это всего лишь сумма длин краев, которые образуют поверхность. Глубина может быть рассчитана как расстояние от вершины к краю поверхности, а интерполяция даст вам приблизительную глубину во всем полигоне. Квады должны дать вам лучшую интерполяцию, а затем треугольники.

+0

спасибо за ответчик, но я новый для шейдерного языка и не понял, что вы сказали не могли бы вы рассказать, что вы сказали , или вести меня куда-нибудь (сайт), чтобы я смог получить достаточно знаний, чтобы понять, что – bindassdost

+0

@bindassdost то, что вы должны здесь понимать, - это основы геометрии и линейной алгебры, а также схема, как работает конвейер рендеринга, а затем детали, как реализовать это, было бы тривиально узнать. Можете ли вы уточнить, что именно вы не поняли, тогда я добавлю детали, которые вам нужны. – Vasaka

+0

в основном «как использовать интерполяцию». Я думал, что могу обновить gl_position в вершинном шейдере в соответствии с синусом и нарисовать текстуру просто в фрагментаторе shader. – bindassdost