|
Кто нибуть пытался использовать в Квесте 3D текстуру. Вообще это возможно на "чистом квесте"?
Есть 100% работающий код, по крайней мере в Обезьяне. Проблема, как мне кажется, в channel texture, то есть она мою тектуру читает, но читает как 2D. Куда эту текстуру пихать? Или нужно как то специфически описать семплер в Hlsl? |
|
В квесте нет поддержки 3д текстур, но можно запихать ее в кубемапу, а работать как с обычной 3д текстурой, но кол-во слоев ограничено 6-ю. Вместо sampler2D юзай sampler3D или samplerCUBE. |
|
Спасибо Viik.
Фигня короче,в идеале нужно 128x128x128. Как минимум 32x32x32. Ничего спицефического тупо нойс. Может есть идеи как такой нойс описать в hlsl, и не парится с каналами? Вопрос больше в том как сделать таким нойсом финальную закраску? |
|
Можно попробывать на ходу его сгенерить:
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-я координата указывала на нужный квадрат в текстуре и имитировать линейную фильтрацию, нужно будет читать не одно значение а два и потом их интерполировать. |
|
Вариант первый мне кажется более реальным. 128 текстур это жесть:)))
Огромное спасибо. Щас потестю. |
|
Вообще идея с процедуркой, аля сгенерить на лету, очень хорошая. Она лутше той жести которая мне поначалу пришла в голову типа float Mass3Dcolor[64][64][64]; ))
Но тот первый вариант работает не так как ожидалось. На самом деле это не Nois в хорошем смысле этого слова, то есть я согласен что это шум, при таком тайле все что угодно будет выглядеть как шум. Так сказать Пост Артифакт. Это полоски )). Вот "покрутите" вот эти значения float2(12.9898,78.233) и 43758.5453, в меньшую сторону.
Ничего лутшего чем передать как аргумент функции rand(), хy вершины в пиксельном шейдере мне в голову не пришло, иначе как мне привязать к пикселю? Может мои полоски из за этого.
Может есть готовый алгоритм для генерации именно ноиса? Я пока Гуглю...
|
|
Эту функцию делали для рендомного семплинга текстуры поэтому координаты пикселя поидее должы лучше всего подходить, странно что появляються полосы, скорее всего это "бандинг" - толи недостаток точности толи повторяемость величин, можно попробывать смешать эту штуку с еще одной случайной величиной, с цветной текстурой обычного гаусового нойза (можно сделать в фотошопе), сгенерить три цвета и какуюто альфу, потом затайлить эту текстуру в экранных координатах + еще и подавать в функцию рендома сумму первых двух и двух последних каналов цвета как аргументы. А скейлить координаты пикселя не пробывал? Например свести их к 0..1 диапазону или наобор увеличить до десятков..сотен. Насколько я понял функцию использовали на величинах больше и меньше единицы, для семплинга глубины в ССАО. |
|
Вариант с использованием 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 Огромное спасибо за общение.
|
|
В случае юзания 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
|
|
Не внимательно прочитал... примерно понимаю о чем речь. Тут тогда нужно совсем по другому делать. Если не секрет что за шейдинг используеться? Чето типа глиттеринга - пластик с вкраплениями, как бы искрами? В любом случае если нойз должен быть "привязан" к геометрии, то вся эта экранная лабуда не подойдет. Попробуй в ту функцию rand подставить не координаты пикселя а УВешки объекта. Можно попробывать их еще и отскейлить.
« Последнее редактирование: 15 Декабря 2008, 13:20:55 от Viik » |
|
|
О шейдинге пока рано говорить. Когда увидел, что люди из такого нойса генерят, я прям опупел. Вот я и подумал, что можно здорово экономить на текстурах генеря процедурки.
Да нойс должен быть "привязан". Появилось несколько новых идей, пока тестю. Если обломаюсь окончательно, буду ковырять в этом направлении sdk.
|
|
Проблема решена. Спер алгоритм 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); } | |