forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Советы по оптимизации (http://forum.boolean.name/showthread.php?t=17056)

HolyDel 05.11.2012 22:13

Ответ: Советы по оптимизации
 
это оператор вопроса

(expression)?(true expression) : (false expression)

Цитата:

Может это означает что при false = -1 , а при true = 1 ?
да. именно так

Цитата:

return float4 (clip(color.r<20 ? -1:1),color.g,color.b,color.a)
так вроде нельзя.

Код:

clip(color.r<20 ? -1:1);
return float4 (color.r,color.g,color.b,color.a)ж


burovalex 06.11.2012 00:46

Ответ: Советы по оптимизации
 
Вложений: 1
КРУУТААА!!! :compl:
Всё работает!! :ap:
СПАСИБО ВСЕМ ОГРОМНОЕ ЗА ПОМОЩЬ!!!!! :bravo:

оказалось все просто
Vertex shader
Код:

float4x4 matViewProjection;

void vs_main(
  in float4 iPOS : POSITION,
  in float2 iTC : TEXCOORD,
 
  out float4 oPOS : POSITION,
  out float2 oTC : TEXCOORD0,
  out float2 oDIST : TEXCOORD1)  //для дистанции хватит и одного флоата, но не знаю каким типом заменить
 
{
  oPOS = mul(iPOS, matViewProjection );
  oTC = iTC;
  oDIST = oPOS.z;
}

Pixel shader
Код:

sampler TX1;
float4 ps_main(
  float2 TXC : TEXCOORD0,
  float2 DIST : TEXCOORD1
  ) : COLOR0

  float4 TXOUT = tex2D(TX1, TXC);
  clip(DIST<300 ? -1:1);    //почему то дистанция 300 - а по рисунку не скажешь что так много
  return TXOUT;
}


Теперь такой шейдер я хочу наложить на на 3 уровня мешей (low,normal,hi) и должно получится так, что один меш начнет срезаться, а другой на месте среза появляться.
Вот только есть одно но - меш который будет normal, должен исчезать на одной дистанции и появляться на другой.
Можно ли использовать оператор AND?
т.е.
Код:

clip(DIST<300 AND DIST>1000 ? -1:1);
И еще вот такой вопросик, надо ли в блитце дополнительно скрывать ентити, чтобы видяха не обрабатывала уже "вырезанный" меш?

Mr_F_ 06.11.2012 02:06

Ответ: Советы по оптимизации
 
Цитата:

И еще вот такой вопросик, надо ли в блитце дополнительно скрывать ентити, чтобы видяха не обрабатывала уже "вырезанный" меш?
да

Цитата:

clip(DIST<300 AND DIST>1000 ? -1:1);
clip( ((DIST<300) && (DIST>1000)) ? -1:1) )

burovalex 08.11.2012 12:44

Ответ: Советы по оптимизации
 
У меня опять косяк с шейдером. Я думал что сюда:
Код:

texture iTEX;
sampler TEX_DIFFUSE=sampler_state{};

будет ложиться конкретная текстура в разных случаях. А у меня какая последняя текстура сюда положится, та и накладывается на все модели. Помогите разобраться.


Код:

float4x4 matWVP;

const float LODDISTHI;
const float LODDISTLO;

texture iTEX;
sampler TEX_DIFFUSE=sampler_state{};

//===================LOD HIGHT================================
void vs_lodhi(
  in  float4 iPos  : POSITION0,
  in  float3 iTXC  : TEXCOORD0,
  out float4 oPos  : POSITION0,
  out float3 oTXC  : TEXCOORD0,
  out float3 oDIST : TEXCOORD1)
{
  oPos  = mul( iPos, matWVP );
  oTXC  = iTXC;
  oDIST = oPos.z;
}

float4 ps_lodhi(float3 TXC:TEXCOORD0,  float3 DIST: TEXCOORD1) : COLOR0
{
  float4 oTEX = tex2D(TEX_DIFFUSE,TXC);
  clip(DIST<LODDISTHI ? -1:1);
  return oTEX;
}

technique LODHI {pass P0{VertexShader = compile vs_2_0 vs_lodhi(); PixelShader  = compile ps_2_0 ps_lodhi();}}


Mr_F_ 08.11.2012 14:52

Ответ: Советы по оптимизации
 
Цитата:

А у меня какая последняя текстура сюда положится, та и накладывается на все модели.
а как ты её в шейдер передаёшь?

burovalex 08.11.2012 15:41

Ответ: Советы по оптимизации
 
Чтото помучил, вроде заработало. Передавал так:
Код:

Global mesh2=xLoadMesh("./data/mesh/plant/grass1nr.b3d")
tx2=xLoadTexture("./data/mesh/plant/grass1nr.png",4)
xSetEntityEffect mesh2,LODFX
xSetEffectTechnique mesh2,"LODHI"
xSetEffectMatrixSemantic mesh2,"matWVP",WORLDVIEWPROJ
xSetEffectTexture mesh2,"iTEX",tx2
xSetEffectFloat mesh2,"DistHiPoly",7

Текстура то теперь передается, а вот то что она маскированная - шейдеру пофиг

Mr_F_ 08.11.2012 17:28

Ответ: Советы по оптимизации
 
Цитата:

Текстура то теперь передается, а вот то что она маскированная - шейдеру пофиг
маскирование тебе придётся самому в шейдере писать

burovalex 08.11.2012 18:20

Ответ: Советы по оптимизации
 
Я так уже сделал, но думал что есть вариант другой...
Код:

  float4 oTEX = tex2D(TEX_DIFFUSE,TXC);
  clip(DIST<DistLoPoly ? -1:1);
  clip(oTEX.rgb<0.004 ? -1:1);
  return oTEX;

Кстати, проверил xloadtexrute("tex",2), т.е. с альфой шейдер работает без проблем. А когда загружаешь текстуру с флагом маска получается в текстуру альфа не ложится? Это значит ксорсом обрабатываются маски?

И не могу понять, в моем случае условие "oTEX.rgb<0.004" проверяет сумму или умножение r,g и b ??

Mr_F_ 08.11.2012 18:33

Ответ: Советы по оптимизации
 
Цитата:

А когда загружаешь текстуру с флагом маска получается в текстуру альфа не ложится? Это значит ксорсом обрабатываются маски?
тогда ксорс скорее всего создаёт в видеопамяти текстуру без альфаканала.

Цитата:

И не могу понять, в моем случае условие "oTEX.rgb<0.004" проверяет сумму или умножение r,g и b ??
скорее всего это oTEX.rgb < float3(0.004,0.004,0.004) и AND операция всех результатов. ваще даже не думал что оно так скомпилится.

burovalex 08.11.2012 20:35

Ответ: Советы по оптимизации
 
Не понял где надо AND оператор использовать, но пока робит вроде правильно - оставлю )

ВСЁ! У меня чтото получилось. Правда за основу взял не рябь, а сумму ргб, в результате более темные участки исчезают раньше.

Посмотрите плиз пример в аттаче, коментируем по поводу всего!!

И еще раз благодарю всех за помощь, и в особенности Mr_F_!!!

FREE MAN 08.11.2012 21:00

Ответ: Советы по оптимизации
 
Вполне Годный способ! Добавь еще следующие в технику

Код:

AlphaTestEnable  = 1;
 AlphaRef            = 80;
  AlphaFunc            = 5;

что бы не было чёрной обводки на маске

burovalex 08.11.2012 21:06

Ответ: Советы по оптимизации
 
Это прям в шейдер надо писать?

FREE MAN 08.11.2012 21:09

Ответ: Советы по оптимизации
 
Да

burovalex 08.11.2012 21:52

Ответ: Советы по оптимизации
 
Может опять чтото не то сделал, но ничего не изменилось.
Код:

technique LODMNR {
pass P0{
VertexShader = compile vs_2_0 vs_lodmnr();
PixelShader  = compile ps_2_0 ps_lodmnr();
AlphaTestEnable = 1;
AlphaRef = 80;
AlphaFunc = 5;
}}

Может это связано с тем, что я не альфой маску создаю, а отбрасываю с рендера (clip)?

FREE MAN 08.11.2012 22:11

Ответ: Советы по оптимизации
 
Цитата:

Сообщение от burovalex (Сообщение 242955)
Может опять чтото не то сделал, но ничего не изменилось.
Код:

technique LODMNR {
pass P0{
VertexShader = compile vs_2_0 vs_lodmnr();
PixelShader  = compile ps_2_0 ps_lodmnr();
AlphaTestEnable = 1;
AlphaRef = 80;
AlphaFunc = 5;
}}

Может это связано с тем, что я не альфой маску создаю, а отбрасываю с рендера (clip)?

Сделай вот так

Код:

technique LODMNR {
pass P0{

AlphaTestEnable = 1;
AlphaRef = 80;
AlphaFunc = 5;
AlphaBlendEnable = 0;
CullMode        = NONE;

VertexShader = compile vs_2_0 vs_lodmnr();
PixelShader  = compile ps_2_0 ps_lodmnr();

        }
}



Часовой пояс GMT +4, время: 21:09.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot