22 Сентября 2024, 18:35:04
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Навигация по форуму







guest3d
Quest3D - Русскоязычное сообщество > Quest3D > Программирование > 3D текстура
3D текстура
(Прочитано 12342 раз)
  [1]
Печать
Const_47 | **** | Старожил | Сообщений: 299 | « 13 Декабря 2008, 00:43:11 »
3D текстура |
0
Кто нибуть пытался использовать в Квесте 3D текстуру. Вообще
это возможно на "чистом квесте"?

Есть 100% работающий код, по крайней мере в Обезьяне. Проблема, как мне кажется, в channel texture, то есть она мою тектуру читает, но читает как 2D. Куда эту текстуру пихать? Или нужно как то специфически описать семплер в Hlsl?     
Viik | **** | Старожил | Сообщений: 302 | «Ответ #1 13 Декабря 2008, 00:45:00 »
Re: 3D текстура |
1
В квесте нет поддержки 3д текстур, но можно запихать ее в кубемапу, а работать как с обычной 3д текстурой, но кол-во слоев ограничено 6-ю.
Вместо sampler2D юзай sampler3D или samplerCUBE.
Const_47 | **** | Старожил | Сообщений: 299 | «Ответ #2 13 Декабря 2008, 00:57:15 »
Re: 3D текстура |
2
Спасибо Viik.

Фигня короче,в идеале нужно 128x128x128. Как минимум 32x32x32. Ничего спицефического тупо нойс. Может есть идеи
как такой нойс описать в hlsl, и не парится с каналами?
Вопрос больше в том  как сделать таким нойсом финальную закраску? 
Viik | **** | Старожил | Сообщений: 302 | «Ответ #3 13 Декабря 2008, 12:19:35 »
Re: 3D текстура |
3
Можно попробывать на ходу его сгенерить:
Код:
float rand(float2 co){
return 0.5+(fract(sin(dot(co.xy ,float2(12.9898,78.233))) * 43758.5453))*0.5;
}
эта функция будет генерить рендомное значение в зависимости от ху координаты, можно привязать координаты пикселя.

Либо разложить эти 128х128 128 текстур в одну текстуру, переделать мапинг так чтобы 3-я координата указывала на нужный квадрат в текстуре и имитировать линейную фильтрацию, нужно будет читать не одно значение а два и потом их интерполировать.
Const_47 | **** | Старожил | Сообщений: 299 | «Ответ #4 13 Декабря 2008, 20:49:10 »
Re: 3D текстура |
4
Вариант первый мне кажется более реальным.
128 текстур это жесть:)))

Огромное спасибо. Щас потестю.
Const_47 | **** | Старожил | Сообщений: 299 | «Ответ #5 14 Декабря 2008, 00:30:53 »
Re: 3D текстура |
5
Вообще идея с процедуркой, аля сгенерить на лету, очень хорошая. Она лутше той жести которая мне поначалу пришла в голову типа float Mass3Dcolor[64][64][64]; Улыбающийся))

Но тот первый вариант работает не так как ожидалось. На самом деле это не Nois в хорошем смысле этого слова, то есть я согласен что это шум, при таком тайле все что угодно будет выглядеть как шум. Так сказать Пост Артифакт. Это полоски Улыбающийся)). Вот "покрутите" вот эти значения float2(12.9898,78.233) и 43758.5453, в меньшую сторону.

Ничего лутшего чем передать как аргумент функции  rand(),
хy вершины в пиксельном шейдере мне в голову не пришло, иначе как мне привязать к пикселю? Может мои полоски из за этого.

Может есть готовый алгоритм для генерации именно ноиса? Я пока Гуглю...

 
Viik | **** | Старожил | Сообщений: 302 | «Ответ #6 14 Декабря 2008, 01:50:34 »
Re: 3D текстура |
6
Эту функцию делали для рендомного семплинга текстуры поэтому координаты пикселя поидее должы лучше всего подходить, странно что появляються полосы, скорее всего это "бандинг" - толи недостаток точности толи повторяемость величин, можно попробывать смешать эту штуку с еще одной случайной величиной, с цветной текстурой обычного гаусового нойза (можно сделать в фотошопе), сгенерить три цвета и какуюто альфу, потом затайлить эту текстуру в экранных координатах + еще и подавать в функцию рендома сумму первых двух и двух последних каналов цвета как аргументы.
А скейлить координаты пикселя не пробывал? Например свести их к 0..1 диапазону или наобор увеличить до десятков..сотен. Насколько я понял функцию использовали на величинах больше и меньше единицы, для семплинга глубины в ССАО.
Const_47 | **** | Старожил | Сообщений: 299 | «Ответ #7 14 Декабря 2008, 20:41:56 »
Re: 3D текстура |
7
Вариант с использованием 2D текстуры из фотошопа для рендома  скорее всего подойдет.

Ну и как мне достучатся к координатам пикселя? Первое что приходит в голову это в Вершинном mul(IN.Pos,WorldViewProjection) и передавать в Пиксельный как TEXCOORD:).Тогда мои координыты будут в диапазоне(-0.5) -(0.5)Но вот есть поблема. В моем случае это не подойдет, так как если пиксели моего обэкта будут, не в той части экрана, как мгновение скорее:)))(не знаю как это по руски доступно написать), у меня перегенерируется закраска обэкта, поскольку поменяются координаты его пикселей. Ну наверное при SSAO это то что нужно, такой динамичный шум.

В моем случае скорее так, или In.Pos или mul(In.Pos,World). Но тогда как их звести к диапазону 0-1? Ну моно поскалить
In.Pos.xyz*0,01. Но это не диапазон 0-1.

Viik Огромное спасибо за общение.


Viik | **** | Старожил | Сообщений: 302 | «Ответ #8 15 Декабря 2008, 13:10:57 »
Re: 3D текстура |
8
В случае юзания 3-х шейдеров можно использовать VPOS семантику, она дает координаты текущего пикселя на экране. В другом случае можно пропробывать сделать так:
float2 screenUV = worldViewProjPosition.xy * 0.5 + 0.5;
Тобиш нужно из вертексного шейдера перетащить значение положения пикселя в пост перспективе. Просто продублировать значение в пост перспективе:
output.clip_pos = mul(input.pos, mat_WorldViewProjection);
output.worldViewProjPosition = output.clip_pos;

Только вот насчет "y" не уверен, возможно его нужно сначала инвертнуть, до того как * 0.5 + 0.5
Viik | **** | Старожил | Сообщений: 302 | «Ответ #9 15 Декабря 2008, 13:19:23 »
Re: 3D текстура |
9
Не внимательно прочитал... примерно понимаю о чем речь. Тут тогда нужно совсем по другому делать. Если не секрет что за шейдинг используеться? Чето типа глиттеринга - пластик с вкраплениями, как бы искрами?
В любом случае если нойз должен быть "привязан" к геометрии, то вся эта экранная лабуда не подойдет. Попробуй в ту функцию rand подставить не координаты пикселя а УВешки объекта. Можно попробывать их еще и отскейлить.
« Последнее редактирование: 15 Декабря 2008, 13:20:55 от Viik »
Const_47 | **** | Старожил | Сообщений: 299 | «Ответ #10 15 Декабря 2008, 17:48:26 »
Re: 3D текстура |
10
О шейдинге пока рано говорить. Когда увидел, что люди из такого нойса генерят, я прям опупел. Вот я и подумал, что можно здорово экономить на текстурах генеря процедурки.

Да нойс должен быть "привязан". Появилось несколько новых идей, пока тестю. Если обломаюсь окончательно, буду ковырять
в этом направлении sdk.
Const_47 | **** | Старожил | Сообщений: 299 | «Ответ #11 25 Декабря 2008, 16:19:44 »
Re: 3D текстура |
11
Проблема решена.
Спер алгоритм Perlin Noise
3D,2D,1D.
Может ище кому пригодится.
Код:
#define BSIZE 32
#define FULLSIZE 66
#define NOISEFRAC 0.03125

const float4 NTab[66] =
       {-0.854611,-0.453029,0.25378,0,
-0.84528,-0.456307,-0.278002,1,
-0.427197,0.847095,-0.316122,2,
0.670266,-0.496104,0.551928,3,
-0.675674,-0.713842,0.184102,4,
-0.0373602,-0.600265,0.798928,5,
-0.939116,-0.119538,0.322135,6,
0.818521,0.278224,0.502609,7,
0.105335,-0.765291,0.635007,8,
-0.634436,-0.298693,0.712933,9,
-0.532414,-0.603311,-0.593761,10,
0.411375,0.0976618,0.906219,11,
0.798824,-0.416379,-0.434175,12,
-0.691156,0.585681,-0.423415,13,
0.612298,0.0777332,0.786797,14,
0.264612,-0.262848,0.927842,15,
-0.70809,0.0548396,-0.703989,16,
0.933195,-0.294222,-0.206349,17,
0.788936,-0.466718,-0.399692,18,
-0.540183,-0.824413,0.168954,19,
0.469322,-0.184125,0.863617,20,
-0.84773,0.292229,-0.44267,21,
0.450832,0.650314,-0.611427,22,
0.906378,-0.247125,-0.342647,23,
-0.995052,0.0271277,-0.0955848,24,
-0.0252277,-0.778349,0.627325,25,
0.991428,0.128623,0.0229457,26,
-0.842581,-0.290688,0.453384,27,
-0.662511,-0.500545,-0.557256,28,
0.650245,-0.692099,-0.313338,29,
0.636901,0.768918,-0.0558766,30,
-0.437006,0.872104,-0.220138,31,
-0.854611,-0.453029,0.25378,0,
-0.84528,-0.456307,-0.278002,1,
-0.427197,0.847095,-0.316122,2,
0.670266,-0.496104,0.551928,3,
-0.675674,-0.713842,0.184102,4,
-0.0373602,-0.600265,0.798928,5,
-0.939116,-0.119538,0.322135,6,
0.818521,0.278224,0.502609,7,
0.105335,-0.765291,0.635007,8,
-0.634436,-0.298693,0.712933,9,
-0.532414,-0.603311,-0.593761,10,
0.411375,0.0976618,0.906219,11,
0.798824,-0.416379,-0.434175,12,
-0.691156,0.585681,-0.423415,13,
0.612298,0.0777332,0.786797,14,
0.264612,-0.262848,0.927842,15,
-0.70809,0.0548396,-0.703989,16,
0.933195,-0.294222,-0.206349,17,
0.788936,-0.466718,-0.399692,18,
-0.540183,-0.824413,0.168954,19,
0.469322,-0.184125,0.863617,20,
-0.84773,0.292229,-0.44267,21,
0.450832,0.650314,-0.611427,22,
0.906378,-0.247125,-0.342647,23,
-0.995052,0.0271277,-0.0955848,24,
-0.0252277,-0.778349,0.627325,25,
0.991428,0.128623,0.0229457,26,
-0.842581,-0.290688,0.453384,27,
-0.662511,-0.500545,-0.557256,28,
0.650245,-0.692099,-0.313338,29,
0.636901,0.768918,-0.0558766,30,
-0.437006,0.872104,-0.220138,31,
-0.854611,-0.453029,0.25378,0,
-0.84528,-0.456307,-0.278002,1};

///////////// functions

// this is the smoothstep function f(t) = 3t^2 - 2t^3, without the normalization
float3 s_curve(float3 t) { return t*t*( float3(3,3,3) - float3(2,2,2)*t); }
float2 s_curve(float2 t) { return t*t*( float2(3,3) - float2(2,2)*t); }
float  s_curve(float  t) { return t*t*(3.0-2.0*t); }

// 3D version
float noise(float3 v,
const uniform float4 pg[FULLSIZE])
{
    v = v + float3(10000.0f, 10000.0f, 10000.0f);   // hack to avoid negative numbers

    float3 i = frac(v * NOISEFRAC) * BSIZE;   // index between 0 and BSIZE-1
    float3 f = frac(v);            // fractional position

    // lookup in permutation table
    float2 p;
    p.x = pg[ i[0]     ].w;
    p.y = pg[ i[0] + 1 ].w;
    p = p + i[1];

    float4 b;
    b.x = pg[ p[0] ].w;
    b.y = pg[ p[1] ].w;
    b.z = pg[ p[0] + 1 ].w;
    b.w = pg[ p[1] + 1 ].w;
    b = b + i[2];

    // compute dot products between gradients and vectors
    float4 r;
    r[0] = dot( pg[ b[0] ].xyz, f );
    r[1] = dot( pg[ b[1] ].xyz, f - float3(1.0f, 0.0f, 0.0f) );
    r[2] = dot( pg[ b[2] ].xyz, f - float3(0.0f, 1.0f, 0.0f) );
    r[3] = dot( pg[ b[3] ].xyz, f - float3(1.0f, 1.0f, 0.0f) );

    float4 r1;
    r1[0] = dot( pg[ b[0] + 1 ].xyz, f - float3(0.0f, 0.0f, 1.0f) );
    r1[1] = dot( pg[ b[1] + 1 ].xyz, f - float3(1.0f, 0.0f, 1.0f) );
    r1[2] = dot( pg[ b[2] + 1 ].xyz, f - float3(0.0f, 1.0f, 1.0f) );
    r1[3] = dot( pg[ b[3] + 1 ].xyz, f - float3(1.0f, 1.0f, 1.0f) );

    // interpolate
    f = s_curve(f);
    r = lerp( r, r1, f[2] );
    r = lerp( r.xyyy, r.zwww, f[1] );
    return lerp( r.x, r.y, f[0] );
}

// 2D version
float noise(float2 v,
const uniform float4 pg[FULLSIZE])
{
    v = v + float2(10000.0f, 10000.0f);

    float2 i = frac(v * NOISEFRAC) * BSIZE;   // index between 0 and BSIZE-1
    float2 f = frac(v);            // fractional position

    // lookup in permutation table
    float2 p;
    p[0] = pg[ i[0]   ].w;
    p[1] = pg[ i[0]+1 ].w;
    p = p + i[1];

    // compute dot products between gradients and vectors
    float4 r;
    r[0] = dot( pg[ p[0] ].xy,   f);
    r[1] = dot( pg[ p[1] ].xy,   f - float2(1.0f, 0.0f) );
    r[2] = dot( pg[ p[0]+1 ].xy, f - float2(0.0f, 1.0f) );
    r[3] = dot( pg[ p[1]+1 ].xy, f - float2(1.0f, 1.0f) );

    // interpolate
    f = s_curve(f);
    r = lerp( r.xyyy, r.zwww, f[1] );
    return lerp( r.x, r.y, f[0] );
}

// 1D version
float noise(float v,
const uniform float4 pg[FULLSIZE])
{
    v = v + 10000.0f;

    float i = frac(v * NOISEFRAC) * BSIZE;   // index between 0 and BSIZE-1
    float f = frac(v);            // fractional position

    // compute dot products between gradients and vectors
    float2 r;
    r[0] = pg[i].x * f;
    r[1] = pg[i + 1].x * (f - 1.0f);

    // interpolate
    f = s_curve(f);
    return lerp( r[0], r[1], f);
}
 
  [1]
Печать
 
Quest3D - Русскоязычное сообщество > Quest3D > Программирование > 3D текстура
Перейти в: