2011-02-03 4 views
0

Я пытаюсь написать SKYBOX шейдер в DX10, используя следующий код HLSL:DX10 Skybox Shader

////////////////////////////////////////////////////////////////////////// 
// world matrix for each rendered object 
float4x4 g_mWorld; 

// single cubemap texture 
Texture2D g_tCubeMap; 

// basic mirror texture sampler 
SamplerState g_sSamplerMirror 
{ 
    Filter = MIN_MAG_MIP_POINT; 
    AddressU = MIRROR; 
    AddressV = MIRROR; 
}; 

////////////////////////////////////////////////////////////////////////// 
// pre-defined vertex formats for vertex input layouts 
struct VS_INPUT 
{ 
    float3 Position  : POSITION; 
}; 

struct PS_INPUT 
{ 
    float4 SPosition : SV_POSITION; 
    float3 UV   : TEXCOORD; 
}; 

////////////////////////////////////////////////////////////////////////// 
PS_INPUT VS_Default(VS_INPUT Input) 
{ 
    PS_INPUT Output = (PS_INPUT)0; 

    Output.SPosition = float4(Input.Position,1.0f); 
    Output.UV = normalize(mul(Output.SPosition, g_mWorld)).xyz; 

    return Output; 
} 

////////////////////////////////////////////////////////////////////////// 
float4 PS_Default(PS_INPUT Input) : SV_TARGET0 
{ 
    return float4(texCUBE(g_sSamplerMirror, Input.UV)); 
} 

////////////////////////////////////////////////////////////////////////// 
technique10 TECH_Default 
{ 
    pass 
    { 
     SetVertexShader(CompileShader(vs_4_0, VS_Default())); 
     SetPixelShader(CompileShader(ps_4_0, PS_Default())); 
     SetGeometryShader(0); 
    } 
} 

Что дает ошибку «DX-встроенные функции 9 стилей отключены, когда не в режиме совместимости с DX9.» on line 46:

return float4(texCUBE(g_sSamplerMirror, Input.UV)); 

Есть ли альтернатива texCUBE? Как я могу исправить это, не включив режим совместимости dx9?

ответ

1

Поскольку вы используете Shader Model 4, вы должны быть в состоянии создать a TextureCube object, а затем call the Sample method.

+0

Это исправляет проблему, но дает мне эту ошибку: D3D10: ОШИБКА: ID3D10Device :: DrawIndexed: включен Rasterization Unit (PixelShader не имеет значения NULL или глубина/трафарет), но позиция не предоставляется последним шейдером до блок растеризации. [ИСПОЛНИТЕЛЬНАЯ ОШИБКА № 362: DEVICE_DRAW_POSITION_NOT_PRESENT] D3D10: ОШИБКА: ID3D10Device :: DrawIndexed: при рисовании всегда требуется шейдер Vertex, но ни один из них в данный момент не связан. [ИСПОЛНИТЕЛЬНАЯ ОШИБКА № 341: DEVICE_DRAW_VERTEX_SHADER_NOT_SET] – Simononon

+0

Ах, D3D10 чрезвычайно подробные сообщения об ошибках. К сожалению, я не совсем понимаю, как они генерируются только из кода, который вы вставили выше; похоже, что вы оба пишете позицию в своем вершинном шейдере * и * устанавливаете шейдер в эффекте - возможно, вершинный шейдер случайно отключается в вашем коде на C++? –