2013-08-27 2 views
1

Я только что закончил свою карту высот, визуализированную с помощью треугольной полосы в строке. Мое решение было:Карта высот текстуры на основе индексов (OpenGL/GLSL)

height=data[k]; 
coords.push_back((float)col); 
coords.push_back((float)(height/heightscale)); 
coords.push_back((float)row); 
k+=3; //red is enough, im using greyscale 

и индексы для полосы:

for(int row=0;row<infoheader.biHeight-1;row++) 
    { 
    for(int col=0;col<infoheader.biWidth;col++) 
    { 
     indexes.push_back((row+1)*infoheader.biWidth+col); 
     indexes.push_back(row*infoheader.biWidth+col); 
    } 
    } 

Я использую VertexArrayObject и drawelements в петле на строку. Теперь я использую его с одной окраской шейдеров, основанной на высоте, но я хочу, чтобы он совпадал с текстурами (также на основе высоты, но все еще не является моей проблемой)

Я хочу, чтобы текстура была на 2 треугольниках, образующих квад,

0,1-1,1  
| /| 
|/| 
|/ | 
0,0-1,0 

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

Итак, можно ли создать массив только для первого «квадрата» (2 треугольника) и текстурирует всю карту на основе этого, например, увеличивая индексы? Если да, то как я могу это сделать. И еще один: как я могу наложить 1 текстуру поверх всей карты, масштабируя ее по ландшафту.

Я мог бы сделать их с помощью одного квадрата или треугольника с двумя треугольниками, но не для ~ 3 000 000 треугольников.

Основная проблема заключается в индексировании, потому что, если я прав, он рисует не только положение вершины на основе индексов, но и координаты цветов и текстур.

моя карта: http://kepfeltoltes.hu/view/130827/1094341850Untitled_www.kepfeltoltes.hu_.png Я знаю, что это довольно «перегруженный» вопрос, но я до сих пор не нашел правильный путь. EDIT: Я хочу текстурировать текстуры.

ответ

1

я сделать следующие предположения (которые могут быть расслабленными, но вы получите мой дрейф) о вашей сетке и текстурах:

  • они оба квадратная форме
  • экстентов сетки в й и г диапазон от 0 до TERRAIN_WIDTH (что является некоторым положительным целым, включительно).

Если держать выше предположения, ваша текстурные координаты для некоторой вершины вашей местности сетки

v = (v_x, v_y, v_z)

просто

texcoord = (v_x/TERRAIN_WIDTH, v_z/TERRAIN_WIDTH)

Этот texcoord передается в ваш фрагментный шейдер и используется для поиска текстур. Вы можете сгенерировать этот текскодер непосредственно в вашем вершинном шейдере, используя либо значение const, либо, более точно, равномерное значение.

uniform float TERRAIN_WIDTH; // or a less flexible const float TERRAIN_WIDTH; 
uniform mat4 ModelViewProjection; 

in vec4 Position; // x and z assumed to be in 0 .. TERRAIN_WIDTH (inclusive) 

out vec2 TexCoord; 

void main() 
{ 
    TexCoord = Position.xz/TERRAIN_WIDTH: 
    gl_Position = ModelViewProjection * Position; 
} 

Предупреждение: Непроверенные код!

EDIT: В отношении плитки: вышесказанное сохраняется.Однако TERRAIN_WIDTH следует заменить чем-то вроде TILE_WIDTH. Я все еще предполагаю общую квадратную сетку и квадратную плитку.

Например, если вы местность имеет размеры 256х256 и состоит из 4-х плиток с размерами 128х128, в texcoords для вершины в (240, 0, 240) вычисляются следующим образом:

texcoord = (240/TILE_WIDTH, 240/TILE_WIDTH) = (240/128, 240/128) = (1,875, 1,875)

Использование GL_REPEAT в качестве режима TEXTURE_WRAP_S и TEXTURE_WRAP_T (по умолчанию), в целой части (то есть 1) будут просто игнорировать и полученный texcoord равен (0,875, 0,875).

Вы можете видеть, это снова в [0, 1] и будет искать тот же тексель для (240, 0, 240), что и для (112, 0, 112). Таким образом, вы получаете эффект черепицы, используя ту же текстуру.

Примечание: Для того, чтобы наглядно работать с текстурой, ваша текстура должна быть черепицей, иначе иллюзия будет буквально лопнуть по швам. ;)

+0

Ваш гений!: D Я никогда не думал, что мне нужно вычислить texcoords в шейдере, но он работает !!! и даже мне не нужно добавлять еще один vbo, массив или вектор. Большое спасибо!: D –

+0

http://kepfeltoltes.hu/view/130827/726256227Untitled2_www.kepfeltoltes.hu_.png еще раз спасибо !;) –

+0

Вам не обязательно. Вы могли бы также моделировать свою местность в каком-нибудь инструменте DCC, таком как Blender, создавать UV-объекты там, экспортировать UV-файлы, загружать их вместе с вашими позициями и напрямую их размещать из объекта-буфера. Ах и BTW, я уверен, черт возьми, не гений. ;) – thokra