13.08.2014, 06:35
|
#161
|
Быдлокодер
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,033
Написано 2,318 полезных сообщений (для 5,357 пользователей)
|
Ответ: 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)
|
|