|
3D-программирование Вопросы, касающиеся программирования 3D мира |
05.11.2012, 22:13
|
#61
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Советы по оптимизации
это оператор вопроса
(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)ж
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.11.2012, 00:46
|
#62
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Советы по оптимизации
КРУУТААА!!!
Всё работает!!
СПАСИБО ВСЕМ ОГРОМНОЕ ЗА ПОМОЩЬ!!!!!
оказалось все просто
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);
И еще вот такой вопросик, надо ли в блитце дополнительно скрывать ентити, чтобы видяха не обрабатывала уже "вырезанный" меш?
__________________
|
(Offline)
|
|
06.11.2012, 02:06
|
#63
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Советы по оптимизации
И еще вот такой вопросик, надо ли в блитце дополнительно скрывать ентити, чтобы видяха не обрабатывала уже "вырезанный" меш?
|
да
clip(DIST<300 AND DIST>1000 ? -1:1);
|
clip( ((DIST<300) && (DIST>1000)) ? -1:1) )
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
08.11.2012, 12:44
|
#64
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Советы по оптимизации
У меня опять косяк с шейдером. Я думал что сюда:
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();}}
__________________
|
(Offline)
|
|
08.11.2012, 14:52
|
#65
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Советы по оптимизации
А у меня какая последняя текстура сюда положится, та и накладывается на все модели.
|
а как ты её в шейдер передаёшь?
|
(Offline)
|
|
08.11.2012, 15:41
|
#66
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Советы по оптимизации
Чтото помучил, вроде заработало. Передавал так:
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
Текстура то теперь передается, а вот то что она маскированная - шейдеру пофиг
__________________
|
(Offline)
|
|
08.11.2012, 17:28
|
#67
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Советы по оптимизации
Текстура то теперь передается, а вот то что она маскированная - шейдеру пофиг
|
маскирование тебе придётся самому в шейдере писать
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
08.11.2012, 18:20
|
#68
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Советы по оптимизации
Я так уже сделал, но думал что есть вариант другой...
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 ??
__________________
|
(Offline)
|
|
08.11.2012, 18:33
|
#69
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Советы по оптимизации
А когда загружаешь текстуру с флагом маска получается в текстуру альфа не ложится? Это значит ксорсом обрабатываются маски?
|
тогда ксорс скорее всего создаёт в видеопамяти текстуру без альфаканала.
И не могу понять, в моем случае условие "oTEX.rgb<0.004" проверяет сумму или умножение r,g и b ??
|
скорее всего это oTEX.rgb < float3(0.004,0.004,0.004) и AND операция всех результатов. ваще даже не думал что оно так скомпилится.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
08.11.2012, 20:35
|
#70
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Советы по оптимизации
Не понял где надо AND оператор использовать, но пока робит вроде правильно - оставлю )
ВСЁ! У меня чтото получилось. Правда за основу взял не рябь, а сумму ргб, в результате более темные участки исчезают раньше.
Посмотрите плиз пример в аттаче, коментируем по поводу всего!!
И еще раз благодарю всех за помощь, и в особенности Mr_F_!!!
__________________
Последний раз редактировалось burovalex, 10.01.2013 в 23:17.
|
(Offline)
|
|
08.11.2012, 21:00
|
#71
|
Разработчик
Регистрация: 20.02.2010
Сообщений: 397
Написано 173 полезных сообщений (для 565 пользователей)
|
Ответ: Советы по оптимизации
Вполне Годный способ! Добавь еще следующие в технику
AlphaTestEnable = 1;
AlphaRef = 80;
AlphaFunc = 5;
что бы не было чёрной обводки на маске
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
08.11.2012, 21:06
|
#72
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Советы по оптимизации
Это прям в шейдер надо писать?
__________________
|
(Offline)
|
|
08.11.2012, 21:09
|
#73
|
Разработчик
Регистрация: 20.02.2010
Сообщений: 397
Написано 173 полезных сообщений (для 565 пользователей)
|
Ответ: Советы по оптимизации
Да
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
08.11.2012, 21:52
|
#74
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Советы по оптимизации
Может опять чтото не то сделал, но ничего не изменилось.
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)?
__________________
|
(Offline)
|
|
08.11.2012, 22:11
|
#75
|
Разработчик
Регистрация: 20.02.2010
Сообщений: 397
Написано 173 полезных сообщений (для 565 пользователей)
|
Ответ: Советы по оптимизации
Сообщение от burovalex
Может опять чтото не то сделал, но ничего не изменилось.
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();
}
}
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:00.
|