Войти
ПрограммированиеФорумГрафика

Текстурирование ландшафта (смешивание текстур) OpenGL - пост N 36 (4 стр)

Страницы: 1 2 3 4 5 Следующая »
#45
14:09, 8 апр 2008

Вобщем такой вопрос. Вот у меня получился такой ландшафт.
Смешивание текстур | Текстурирование ландшафта (смешивание текстур) OpenGL - пост N 36

Вобщем то все ок, но только шейдер гасит освещение, я запихнул дифузное освещение в шейдер с смешиванием, ну результат виден, все какое-то сильно яркое.
Как сделать нормальное освещение?

#46
14:30, 8 апр 2008

освещение per pixel считаешь? Засвет может быть если сумма rgba для текстуры смешивания больше 1.0

#47
14:36, 8 апр 2008

d.m.k
Ну как ты вобще делал, не стандартным же. Я взял первое попавшиеся освешение:

//
// Blinn vertex shader
//

varying  vec3 l;
varying  vec3 h;
varying  vec3 n;
varying vec3 v;

uniform  vec4  lightPos;
uniform  vec4  eyePos;

void main(void)
{
  vec3  p = vec3 ( gl_ModelViewMatrix * gl_Vertex );      // transformed point to world space

  l = normalize ( vec3 ( lightPos ) - p );          // vector to light source
  v = normalize ( vec3 ( eyePos )  - p );          // vector to the eye
  h = normalize ( l + v );
  n = normalize ( gl_NormalMatrix * gl_Normal );              // transformed n

  gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

//
// Blinn fragment shader
//

varying  vec3 l;
varying  vec3 h;
varying vec3 v;
varying vec3 n;

void main (void)
{
  const vec4  diffColor = vec4 ( 0.8, 0.8, 0.8, 1.0 );
  const vec4  specColor = vec4 ( 0.9, 0.9, 0.9, 1.0 );
  const float  specPower = 50.0;

  vec3  n2  = normalize ( n );
  vec3  l2  = normalize ( l );
  vec3  h2  = normalize ( h );
  vec4  diff = diffColor * max ( dot ( n2, l2 ), 0.0 );
  vec4  spec = specColor * pow ( max ( dot ( n2, h2 ), 0.0 ), specPower );

  gl_FragColor = diff + spec;
}

Тока я написал gl_FragColor = diff + (тута смешивание тесктур). Может само освешение карявое?

#48
14:44, 8 апр 2008

почему ты смешивание прибавляешь к diff... надо умножать на него...

#48
14:44, 8 апр 2008

Vel I
gl_FragColor = diff * (тута смешивание тесктур)

#50
14:45, 8 апр 2008

0r@ngE
опередил )

#51
14:47, 8 апр 2008

d.m.k
=)
Vel I
gl_FragColor = vec4( (тута смешивание тесктур).rgb * max ( dot ( n2, l2 ), 0.0 ), 1.0 );
specular вообще убери

#52
14:49, 8 апр 2008

Кстати, кто нибудь делал ландшавты не на регулярной сетке?

#53
15:21, 8 апр 2008

0r@ngE
Точно, сенк. Теперь все нормально. А ты какое освещение юзаешь?
d.m.k
Эт как?

#54
15:25, 8 апр 2008

Vel I
> А ты какое освещение юзаешь?

для ландшафта? dot( n, l );  =)

#55
15:29, 8 апр 2008

0r@ngE
Ну мне мое больше нравится, так сильно темно получается.

Вобще я не думал что смешивание такое простое, и что шейдеры это не сложно. Епт, эта тема меня сделала другим человеком =)
Спасибо всем кто помогал!

#56
18:31, 8 апр 2008

Vel I
>Эт как?

ну например на сплайнах, или как у nVidia в деме на процедурной геометрии... вот и поинтересовался, может кто еще какие способы знает кроме карты высот и сетки...

Прошло более 1 года
#57
6:11, 28 авг 2009

таааак ))))) я влезу с парочкой вопросов тема как раз для меня актуальная )

остались такие вопросы
в итоге самое оптимальное решение как я понял предоставил 0r@ngE смешав его с Wo2lf
но остались такие вопросы
есть карта высот
получается каждая "высота" помимо своей высоты несет в себе
1 все текстуры ?
2 альфа каждой текстуры ?

получается в шойдер в атрибутах для каждой вершины мы отправляем текстуры + альфы для этих текстур ? дальше смешиваем соотвесвенно получая нужный цвет


плюсы из этого, заключаются действительно в простом редактировании ,если редактор сбрасывает карту высот, в которой каждая точка несет в себе информацию о текстурах и ее альфы, то конечно можно наворотить всего чего хочешь
непонятна цифра у 0r@ngE - 6, почему максимум 6 ?1 атрибут  максимум может нести в себе 4 параметра ( vec4 максимум же ) ,получается либо 4 альфы, либо 8 ( если два атрибута под это отдать ? )

#58
8:27, 28 авг 2009

I
У меня так:
весь ландшафт поделен на патчи (читай куски), размер подбирается эмпирически. Каждый кусок имеет список текстур которые внутри него задействованы [1-6].
в вершинных аттрибутах указаны веса этих текстур.
Пример псевдо-c++ кодом

GLuint textures[6];
texcoord7.z = вес 1-й текстуры
texcoord7.w= вес 2-й текстуры
texcoord8.x= вес 3-й текстуры
texcoord8.y= вес 4-й текстуры
texcoord8.z= вес 5-й текстуры
texcoord8.w= вес 6-й текстуры

// шейдер
gl_FragColor = texture2D(tex1, uv1) * uv7.z +
                        texture2D(tex2, uv2) * uv7.w +
                        texture2D(tex3, uv3) * uv8.x +
                        texture2D(tex4, uv4) * uv8.y +
                        texture2D(tex5, uv5) * uv8.z +
                        texture2D(tex6, uv6) * uv8.w;

> непонятна цифра у 0r@ngE - 6, почему максимум 6 ?
:) а вот так, как видишь выше, остальное место уже занято :)

#59
8:42, 28 авг 2009

fnks все понятно ! просплюсь сделаю ! спасибо !
кстате учитывая, что платформа у меня GLSL ES, а в нем как известно уже все на кастомных атрибутах ( то есть текстурных атрибутов и прочего нету ) то тут можно не ограничиваться вобще )))))

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.