Показать сообщение отдельно
Старый 09.04.2011, 00:37   #25
ІГРОГРАЙКО
ПроЭктировщик
 
Аватар для ІГРОГРАЙКО
 
Регистрация: 20.06.2009
Адрес: Україна
Сообщений: 152
Написано 10 полезных сообщений
(для 24 пользователей)
Смущение Ответ: Volume Rendering на XNA (Texture3D)

Добрый вечер!

У меня возник вопрос связаный с шейдером.

Код:
float4x4 WorldViewProj;

texture3D Volume;

sampler3D SVolume = sampler_state
{
	Texture = <Volume>;
	MinFilter = LINEAR;
	MagFilter = LINEAR;
	MipFilter = LINEAR;
};

struct VS_INPUT
{
    float4 Position : POSITION0;
};

struct VS_OUTPUT
{
    float4 Position : POSITION0;
    float4 pos : TEXCOORD0;
};

VS_OUTPUT PositionVS(VS_INPUT input)
{
    VS_OUTPUT output;
	
    output.Position = mul(input.Position, WorldViewProj);
    output.pos = input.Position;
    
    return output;
}

float4 PixelShaderFunction(VS_OUTPUT input) : COLOR0
{		
    float4 texColor = tex3D(SVolume,input.pos);
    return texColor;
}

technique BasicView
{
    pass Pass1
    {
        VertexShader = compile vs_1_1 PositionVS();
        PixelShader = compile ps_1_1 PixelShaderFunction();
    }
}
Мне нужно отрезать половину 3Д текстуры. Я подумал, что лучше всего ето можно осуществить умножением Альфа канала 3Д текстури на "0" в заданом промежутке:
float4x4 WorldViewProj;

texture3D Volume;

sampler3D SVolume = sampler_state
{
	Texture = <Volume>;
	MinFilter = LINEAR;
	MagFilter = LINEAR;
	MipFilter = LINEAR;
};

struct VS_INPUT
{
    float4 Position : POSITION0;
};

struct VS_OUTPUT
{
    float4 Position : POSITION0;
    float4 pos : TEXCOORD0;
};

VS_OUTPUT PositionVS(VS_INPUT input)
{
    VS_OUTPUT output;
	
    output.Position = mul(input.Position, WorldViewProj);
    output.pos = input.Position;
    
    return output;
}

float4 PixelShaderFunction(VS_OUTPUT input) : COLOR0
{
    float4 outColor;

    if(input.Position.x > 0.5f)
	outColor = float4(1,1,1,0);
    else
	outColor = float4(1,1,1,1);
		
    float4 texColor = tex3D(SVolume,input.pos);
    return texColor * outColor;
}

technique BasicView
{
    pass Pass1
    {
        VertexShader = compile vs_1_1 PositionVS();
        PixelShader = compile ps_1_1 PixelShaderFunction();
    }
}
Но при построении оно вилетает:
Ошибка	1	Errors compiling C:\Documents and Settings\Володя\Мои документы\Visual Studio 2008\Projects\Vol_Render\Vol_Render\Content\Shaders\VolumeRendering.fx:
C:\Documents and Settings\Володя\Мои документы\Visual Studio 2008\Projects\Vol_Render\Vol_Render\Content\Shaders\VolumeRendering.fx(20): error X4502: invalid reference to input semantic 'POSITION0'
C:\Documents and Settings\Володя\Мои документы\Visual Studio 2008\Projects\Vol_Render\Vol_Render\Content\Shaders\VolumeRendering.fx(52): ID3DXEffectCompiler::CompileEffect: There was an error compiling expression
ID3DXEffectCompiler: Compilation failed	C:\Documents and Settings\Володя\Мои документы\Visual Studio 2008\Projects\Vol_Render\Vol_Render\Content\Shaders\VolumeRendering.fx	20	1	Vol_Render
Не понимаю почему???
Помогите исправить ошибку, пожалуйста!
__________________
Blitz3D, XNA, WebGL, OpenGL, Unity3D
PC: ASUS A55VM Core i3 (2.4Ghz), 6 Gb RAM, Nvidia GF 630M GT 2Gb
(Offline)
 
Ответить с цитированием