GLSL-код для 2D местности с рендерингом карты высот - PullRequest
0 голосов
/ 05 июля 2011

У меня есть двухмерная карта на основе плитки и изображение карты высот, которые я хотел бы использовать, чтобы карта выглядела менее плоской.Но я новичок в GLSL, который используется в SFML.Я ищу шейдер GLSL, которому я могу передать текстуру плитки и часть карты высот по тем же координатам или что-то подобное, чтобы создать иллюзию высоты.Но я делаю все сам, и у меня нет времени изучать GLSL только для этого одного шейдера, который я хотел бы использовать, поэтому спасибо за любой ответ (лучше всего, если кто-то может опубликовать некоторый код шейдера и объяснить его для манекенов, как этоиспользуется в файле .cpp)

Ответы [ 3 ]

0 голосов
/ 05 июля 2011

Это пнет Z на экране, чтобы создать иллюзию карты высот. Это на самом деле не меняет геометрию. [править] Это не полезно для вида сверху вниз. Я бы попробовал добавить какой-нибудь эффект тени на основе нового Z и направления света.

Эта строка: pos.z + = color.x + color.y + color.z; - это то, что толкает Z. Вы можете присвоить шкале положительное или отрицательное число.

/* 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;
}  
0 голосов
/ 06 февраля 2016

Это деформирует сетку ландшафта с основанием в форме пузыря / купола, где бы ни находился свет в мировом пространстве.Чем больше рельеф местности, тем лучше результаты.

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);
0 голосов
/ 05 июля 2011

Вас, вероятно, интересует техника "Параллакс-окклюзионное картирование" . Хорошую реализацию можно найти здесь .

...