|
Xors3D Графический движок с поддержкой DirectX9 |
12.08.2014, 15:55
|
#151
|
Быдлокодер
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,021
Написано 2,312 полезных сообщений (для 5,349 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
Сообщение от Mr_F_
да, потому что ты объявляешь пустую неопределённую переменную и сравниваешь ещё с чем-то.
VFACE над вставить в входящие данные PS.
там где у тебя всякие TexCoords : TEXCOORD0, туда же вставляешь что-нибудь типа whatFace : VFACE.
|
Уже делал, дебагер ругается на "lit", не объявленная переменная:
float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ;
float4x4 matrixWorld : MATRIX_WORLD;
float3 lightDirection : LIGHT0_DIRECTION;
float4 lightColor : LIGHT0_COLOR;
float4 entityColor : COLOR_DIFFUSE;
float whatFace : VFACE;
texture diffuseTexture : TEXTURE_0;
sampler diffuseSampler = sampler_state
{
Texture = <diffuseTexture>;
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
MinFilter = ANISOTROPIC;
MagFilter = ANISOTROPIC;
MipFilter = ANISOTROPIC;
MaxAnisotropy = 16;
};
struct VSInput {
float4 position : POSITION0;
float3 normal : NORMAL;
float2 texCoords : TEXCOORD0;
};
struct VSOutput {
float4 position : POSITION0;
float3 normal : TEXCOORD1;
float2 texCoords : TEXCOORD0;
};
VSOutput VSMain(VSInput input) {
VSOutput output;
output.position = mul (input.position, matrixWorldViewProj);
output.normal = normalize(mul(input.normal, matrixWorld));
output.texCoords = input.texCoords;
return output;
}
float4 PSMain( VSOutput input) : COLOR {
float4 diffuse = tex2D(diffuseSampler, input.texCoords);
float4 color;
color = tex2D( diffuseSampler, input.texCoords.xy);
if (diffuse.a < 0.5f) discard;
if (whatFace < -1 )
{
float lit = dot(-input.normal , -lightDirection);
}
else
{
float lit = dot(input.normal , -lightDirection);
}
return diffuse * entityColor * lit * lightColor;
}
technique Diffuse {
pass p0 {
PixelShader = compile ps_3_0 PSMain();
VertexShader = compile vs_3_0 VSMain();
CullMode = none;
}
}
______________________________
Запихал ретурн после каждого условия и понял что мой код не работает вообще. То есть освещение не флипается там где надо, у меня флипается всё.
______________________________
Кажется понял что я не так сделал. Но как сделать правильно не понял.
|
(Offline)
|
|
12.08.2014, 16:46
|
#152
|
Мастер
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений (для 631 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
У каждой переменной есть область видимости (scope), которая обычно задается фигурными скобками {}. Объявленная внутри них переменная не может использоваться вне своей зоны видимости. Поэтому можно вынести объявление lit за пределы конструкции if-else:
float lit;
if ( whatFace < -1 ) {
lit = dot( -input.normal, -lightDirection );
} else {
lit = dot( input.normal, -lightDirection );
}
return diffuse * entityColor * lit * lightColor;
Вообще синтаксис и семантика HLSL (да и GLSL) во многом схожи с языком С. Поэтому если у тебя есть время - почитай книжки всякие про него. В отличие от С++, С не так трудно начинать изучать.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
13.08.2014, 02:39
|
#153
|
Быдлокодер
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,021
Написано 2,312 полезных сообщений (для 5,349 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
Не понимаю почему так не работает?
Проверки тупо нету.
float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ;
float4x4 matrixWorld : MATRIX_WORLD;
float3 lightDirection : LIGHT0_DIRECTION;
float4 lightColor : LIGHT0_COLOR;
float4 entityColor : COLOR_DIFFUSE;
float whatFace : VFACE;
texture diffuseTexture : TEXTURE_0;
sampler diffuseSampler = sampler_state
{
Texture = <diffuseTexture>;
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
MinFilter = ANISOTROPIC;
MagFilter = ANISOTROPIC;
MipFilter = ANISOTROPIC;
MaxAnisotropy = 16;
};
struct VSInput {
float4 position : POSITION0;
float3 normal : NORMAL;
float2 texCoords : TEXCOORD0;
};
struct VSOutput {
float4 position : POSITION0;
float3 normal : TEXCOORD1;
float2 texCoords : TEXCOORD0;
};
VSOutput VSMain(VSInput input) {
VSOutput output;
output.position = mul (input.position, matrixWorldViewProj);
output.normal = normalize(mul(input.normal, matrixWorld));
output.texCoords = input.texCoords;
return output;
}
float4 PSMain( VSOutput input) : COLOR {
float4 diffuse = tex2D(diffuseSampler, input.texCoords);
float4 color;
color = tex2D( diffuseSampler, input.texCoords.xy);
if (diffuse.a < 0.5f) discard;
float lit;
if ( whatFace == -1 )
{
lit = dot(-input.normal , -lightDirection);
}
else
{
lit = dot(input.normal , -lightDirection);
}
return diffuse * entityColor * lit * lightColor;
}
technique Diffuse {
pass p0 {
PixelShader = compile ps_3_0 PSMain();
VertexShader = compile vs_3_0 VSMain();
CullMode = none;
}
}
Слева Хорс, справа шейдер:
|
(Offline)
|
|
13.08.2014, 02:59
|
#154
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
попробуй if ( whatFace < 0 ), не уверен что там точное значение стоит на каждый фейс.
|
(Offline)
|
|
13.08.2014, 03:32
|
#155
|
Быдлокодер
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,021
Написано 2,312 полезных сообщений (для 5,349 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
Сообщение от Mr_F_
попробуй if ( whatFace < 0 ), не уверен что там точное значение стоит на каждый фейс.
|
Сделала в первую очередь
Как ещё можно сделать подобную штуку? Попробовать считать свет для обеих сторон?
|
(Offline)
|
|
13.08.2014, 03:44
|
#156
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
только сейчас заметил, что он у тебя как глобал объявлен.
нужно в VSOutput вставить.
в глобале только то, что одинаково на весь шейдер.
в VSOutput у тебя то, что приходит в пиксельный шейдер из VS интерполированное, и VFACE дополнительно из растеризатора - это инфа попиксельная.
|
(Offline)
|
|
13.08.2014, 04:12
|
#157
|
Быдлокодер
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,021
Написано 2,312 полезных сообщений (для 5,349 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
Сообщение от Mr_F_
только сейчас заметил, что он у тебя как глобал объявлен.
нужно в VSOutput вставить.
в глобале только то, что одинаково на весь шейдер.
в VSOutput у тебя то, что приходит в пиксельный шейдер из VS интерполированное, и VFACE дополнительно из растеризатора - это инфа попиксельная.
|
Но, как это правильно сделать?
Если так то переменная "whatFace" не найдена:
float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ;
float4x4 matrixWorld : MATRIX_WORLD;
float3 lightDirection : LIGHT0_DIRECTION;
float4 lightColor : LIGHT0_COLOR;
float4 entityColor : COLOR_DIFFUSE;
texture diffuseTexture : TEXTURE_0;
sampler diffuseSampler = sampler_state
{
Texture = <diffuseTexture>;
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
MinFilter = ANISOTROPIC;
MagFilter = ANISOTROPIC;
MipFilter = ANISOTROPIC;
MaxAnisotropy = 16;
};
struct VSInput {
float4 position : POSITION0;
float3 normal : NORMAL;
float2 texCoords : TEXCOORD0;
};
struct VSOutput {
float4 position : POSITION0;
float3 normal : TEXCOORD1;
float2 texCoords : TEXCOORD0;
float whatFace : VFACE;
};
VSOutput VSMain(VSInput input) {
VSOutput output;
output.position = mul (input.position, matrixWorldViewProj);
output.normal = normalize(mul(input.normal, matrixWorld));
output.texCoords = input.texCoords;
return output;
}
float4 PSMain( VSOutput input) : COLOR {
float4 diffuse = tex2D(diffuseSampler, input.texCoords);
float4 color;
color = tex2D( diffuseSampler, input.texCoords.xy);
if (diffuse.a < 0.5f) discard;
float lit;
if ( whatFace == -1 )
{
lit = dot(-input.normal , -lightDirection);
}
else
{
lit = dot(input.normal , -lightDirection);
}
return diffuse * entityColor * lit * lightColor;
}
technique Diffuse {
pass p0 {
PixelShader = compile ps_3_0 PSMain();
VertexShader = compile vs_3_0 VSMain();
CullMode = none;
}
}
|
(Offline)
|
|
13.08.2014, 04:14
|
#158
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
ну потому что теперь ты её должен читать как input.whatFace. так же как и всё, что ты читаешь из VSOutput.
|
(Offline)
|
|
13.08.2014, 04:34
|
#159
|
Быдлокодер
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,021
Написано 2,312 полезных сообщений (для 5,349 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
Сообщение от Mr_F_
ну потому что теперь ты её должен читать как input.whatFace. так же как и всё, что ты читаешь из VSOutput.
|
То есть так?
float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ;
float4x4 matrixWorld : MATRIX_WORLD;
float3 lightDirection : LIGHT0_DIRECTION;
float4 lightColor : LIGHT0_COLOR;
float4 entityColor : COLOR_DIFFUSE;
texture diffuseTexture : TEXTURE_0;
sampler diffuseSampler = sampler_state
{
Texture = <diffuseTexture>;
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
MinFilter = ANISOTROPIC;
MagFilter = ANISOTROPIC;
MipFilter = ANISOTROPIC;
MaxAnisotropy = 16;
};
struct VSInput {
float4 position : POSITION0;
float3 normal : NORMAL;
float2 texCoords : TEXCOORD0;
float whatFace : VFACE;
};
struct VSOutput {
float4 position : POSITION0;
float3 normal : TEXCOORD1;
float2 texCoords : TEXCOORD0;
float whatFace : VFACE;
};
VSOutput VSMain(VSInput input) {
VSOutput output;
output.position = mul (input.position, matrixWorldViewProj);
output.normal = normalize(mul(input.normal, matrixWorld));
output.texCoords = input.texCoords;
output.whatFace = input.whatFace;
return output;
}
float4 PSMain( VSOutput input) : COLOR {
float4 diffuse = tex2D(diffuseSampler, input.texCoords);
float4 color;
color = tex2D( diffuseSampler, input.texCoords.xy);
if (diffuse.a < 0.5f) discard;
float lit;
if ( input.whatFace == -1 )
{
lit = dot(-input.normal , -lightDirection);
}
else
{
lit = dot(input.normal , -lightDirection);
}
return diffuse * entityColor * lit * lightColor;
}
technique Diffuse {
pass p0 {
PixelShader = compile ps_3_0 PSMain();
VertexShader = compile vs_3_0 VSMain();
CullMode = none;
}
}
Дебагер говорит инвалид:
(35): error X4502: invalid input semantic 'VFACE'
(99): ID3DXEffectCompiler::CompileEffect: There was an error compiling expression
ID3DXEffectCompiler: Compilation failed
|
|
(Offline)
|
|
13.08.2014, 05:33
|
#160
|
Мастер
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений (для 631 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
VFACE нету на входе в вершинный шейдер - он вычисляется автоматически между вершинным и пиксельным шейдером. Поэтому он не может быть в структуре VSInput.
Попробуй сначала убрать whatFace из VSInput а в вершинном шейдере ничего не присваивай output.whatFace или присвой 0.
А уже из пиксельного ты можешь обратиться к ней как input.whatFace и в ней уже будет содержаться нужное значение.
Должно работать.
Однако если вдруг компилятор всё-равно скажет что нет такой семантики (хотя вроде не должен), тогда тебе придется разделить VSOutput на две разные структуры - VSOutput и PSInput, и во второй добавишь VFACE.
|
(Offline)
|
|
13.08.2014, 06:35
|
#161
|
Быдлокодер
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,021
Написано 2,312 полезных сообщений (для 5,349 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
Сообщение от Samodelkin
VFACE нету на входе в вершинный шейдер - он вычисляется автоматически между вершинным и пиксельным шейдером. Поэтому он не может быть в структуре VSInput.
Попробуй сначала убрать whatFace из VSInput а в вершинном шейдере ничего не присваивай output.whatFace или присвой 0.
А уже из пиксельного ты можешь обратиться к ней как input.whatFace и в ней уже будет содержаться нужное значение.
Должно работать.
|
Не сработало, куча ошибок.
Однако если вдруг компилятор всё-равно скажет что нет такой семантики (хотя вроде не должен), тогда тебе придется разделить VSOutput на две разные структуры - VSOutput и PSInput, и во второй добавишь VFACE.
|
float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ;
float4x4 matrixWorld : MATRIX_WORLD;
float3 lightDirection : LIGHT0_DIRECTION;
float4 lightColor : LIGHT0_COLOR;
float4 entityColor : COLOR_DIFFUSE;
texture diffuseTexture : TEXTURE_0;
sampler diffuseSampler = sampler_state
{
Texture = <diffuseTexture>;
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
MinFilter = ANISOTROPIC;
MagFilter = ANISOTROPIC;
MipFilter = ANISOTROPIC;
MaxAnisotropy = 16;
};
struct VSInput {
float4 position : POSITION0;
float3 normal : NORMAL;
float2 texCoords : TEXCOORD0;
};
struct VSOutput {
float4 position : POSITION0;
float3 normal : TEXCOORD1;
float2 texCoords : TEXCOORD0;
}
PSInput {
float whatFace : VFACE;
};
VSOutput VSMain(VSInput input) {
VSOutput output;
output.position = mul (input.position, matrixWorldViewProj);
output.normal = normalize(mul(input.normal, matrixWorld));
output.texCoords = input.texCoords;
output.whatFace = iput.whatFace;
return output;
}
float4 PSMain( VSOutput input) : COLOR {
float4 diffuse = tex2D(diffuseSampler, input.texCoords);
float4 color;
color = tex2D( diffuseSampler, input.texCoords.xy);
if (diffuse.a < 0.5f) discard;
float lit;
if ( input.whatFace == -1 )
{
lit = dot(-input.normal , -lightDirection);
}
else
{
lit = dot(input.normal , -lightDirection);
}
return diffuse * entityColor * lit * lightColor;
}
technique Diffuse {
pass p0 {
PixelShader = compile ps_3_0 PSMain();
VertexShader = compile vs_3_0 VSMain();
CullMode = none;
}
}
|
(Offline)
|
|
13.08.2014, 11:45
|
#162
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
iput, ок. и вообще убери эту строку полностью.
+ не надо ничего разделять, просто блин оставь так
struct VSOutput {
float4 position : POSITION0;
float3 normal : TEXCOORD1;
float2 texCoords : TEXCOORD0;
float whatFace : VFACE
}
|
(Offline)
|
|
13.08.2014, 15:09
|
#163
|
Быдлокодер
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,021
Написано 2,312 полезных сообщений (для 5,349 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
Сообщение от Mr_F_
iput, ок. и вообще убери эту строку полностью.
+ не надо ничего разделять, просто блин оставь так
struct VSOutput {
float4 position : POSITION0;
float3 normal : TEXCOORD1;
float2 texCoords : TEXCOORD0;
float whatFace : VFACE
}
|
О, это уже не соображал.
Так тоже сделала в первую очередь:
float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ;
float4x4 matrixWorld : MATRIX_WORLD;
float3 lightDirection : LIGHT0_DIRECTION;
float4 lightColor : LIGHT0_COLOR;
float4 entityColor : COLOR_DIFFUSE;
texture diffuseTexture : TEXTURE_0;
sampler diffuseSampler = sampler_state
{
Texture = <diffuseTexture>;
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
MinFilter = ANISOTROPIC;
MagFilter = ANISOTROPIC;
MipFilter = ANISOTROPIC;
MaxAnisotropy = 16;
};
struct VSInput {
float4 position : POSITION0;
float3 normal : NORMAL;
float2 texCoords : TEXCOORD0;
};
struct VSOutput {
float4 position : POSITION0;
float3 normal : TEXCOORD1;
float2 texCoords : TEXCOORD0;
float whatFace : VFACE;
};
VSOutput VSMain(VSInput input) {
VSOutput output;
output.position = mul (input.position, matrixWorldViewProj);
output.normal = normalize(mul(input.normal, matrixWorld));
output.texCoords = input.texCoords;
return output;
}
float4 PSMain( VSOutput input) : COLOR {
float4 diffuse = tex2D(diffuseSampler, input.texCoords);
float4 color;
color = tex2D( diffuseSampler, input.texCoords.xy);
if (diffuse.a < 0.5f) discard;
float lit;
if ( input.whatFace == -1 )
{
lit = dot(-input.normal , -lightDirection);
}
else
{
lit = dot(input.normal , -lightDirection);
}
return diffuse * entityColor * lit * lightColor;
}
technique Diffuse {
pass p0 {
PixelShader = compile ps_3_0 PSMain();
VertexShader = compile vs_3_0 VSMain();
CullMode = none;
}
}
Дебагер говорит:
(65): error X4000: variable 'output' used without having been completely initialized
(98 ): ID3DXEffectCompiler::CompileEffect: There was an error compiling expression
ID3DXEffectCompiler: Compilation failed
|
|
(Offline)
|
|
13.08.2014, 15:29
|
#164
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
попробуй тогда убрать его из VSOutput, а вместо этого PSMain поменять типа
float4 PSMain(VSOutput input, float whatFace : VFACE) : COLOR {
|
(Offline)
|
|
13.08.2014, 15:59
|
#165
|
Быдлокодер
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,021
Написано 2,312 полезных сообщений (для 5,349 пользователей)
|
Ответ: Xors3D. Шейдеры. Урок первый
Сообщение от Mr_F_
попробуй тогда убрать его из VSOutput, а вместо этого PSMain поменять типа
float4 PSMain(VSOutput input, float whatFace : VFACE) : COLOR {
|
error X3018: invalid subscript 'whatFace'
Нифига не понимаю, попробовал в шейдерах других игр покопаться, не нашёл.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:05.
|