【发布时间】:2014-01-15 16:12:17
【问题描述】:
所以我最近从 XNA 转移到了 SharpDX Toolkit,并从一些基础知识开始。 2d 部分很容易,因为几乎没有任何变化,但我真的在 3d 部分苦苦挣扎。例如,我想根据 riemers 地形教程渲染高度图,但出现以下问题:
我有一个小地图(或地形)类,其中包含索引和顶点数组作为缓冲区,如下所示:
private SharpDX.Toolkit.Graphics.Buffer<VertexPositionNormalTexture> _mesh;
private SharpDX.Toolkit.Graphics.Buffer _indexBuffer;
private readonly static VertexInputLayout InputLayout = VertexInputLayout.New<VertexPositionNormalTexture>(0); // copied from the basic geometry
这会被正确填充并使用 VertexPositionColor 进行渲染。 渲染常见的 XNA 方式:
//set effect parameters and resources
foreach (EffectPass pass in _effect.CurrentTechnique.Passes) {
pass.Apply();
//Globals.DefaultGraphicsDevice.SetRasterizerState(CullNone);
Globals.DefaultGraphicsDevice.SetVertexBuffer(0, _mesh);
// Setup the Vertex Buffer Input layout
Globals.DefaultGraphicsDevice.SetVertexInputLayout(InputLayout);
// Setup the index Buffer
Globals.DefaultGraphicsDevice.SetIndexBuffer(_indexBuffer, true);
// Finally Draw this mesh
Globals.DefaultGraphicsDevice.DrawIndexed(PrimitiveType.TriangleList, _indexBuffer.ElementCount);
}
现在我得到了我自己的半转换半重制着色器
a) 黑色地形或
b) HRESULT: [0x80070057] (错误参数)
我不知道为什么(很可能是因为我从未对 3d 着色器做过很多事情)
着色器:
struct VertexShaderInput {
float4 Position : SV_Position;
float3 Normal : NORMAL;
float2 TextureCoords: TEXCOORD0;
};
struct VertexShaderOutput {
float4 Position : SV_Position;
//float4 VPosition : SV_Position; //im not used to SV_Position and SV_Target so this could be the main problem
float LightingFactor: TEXCOORD0;
float2 TextureCoords: TEXCOORD1;
};
struct PixelShaderOutput {
float4 Color : SV_Target;
};
//------- Constants --------
float4x4 xView;
float4x4 xProjection;
float4x4 xWorld;
float3 xLightDirection;
float xAmbient;
Texture2D xTexture;
sampler TextureSampler = sampler_state {
texture = <xTexture>;
magfilter = LINEAR;
minfilter = LINEAR;
mipfilter = LINEAR;
AddressU = mirror;
AddressV = mirror;
};
VertexShaderOutput TexturedVS(VertexShaderInput VSin) {
VertexShaderOutput Output = (VertexShaderOutput)0;
float4x4 preViewProjection = mul(xView, xProjection);
float4x4 preWorldViewProjection = mul(xWorld, preViewProjection);
Output.Position = mul(VSin.Position, preWorldViewProjection);
Output.TextureCoords = VSin.TextureCoords;
float3 Normal = normalize(mul(normalize(VSin.Normal), xWorld));
Output.LightingFactor = dot(Normal, -xLightDirection);
return Output;
}
PixelShaderOutput TexturedPS(VertexShaderOutput PSIn) {
PixelShaderOutput Output = (PixelShaderOutput)0;
Output.Color = xTexture.Sample(TextureSampler, PSIn.TextureCoords);
Output.Color.rgb *= saturate(PSIn.LightingFactor) + xAmbient;
return Output;
}
technique Textured {
pass p0 {
Profile = 9.1;
AlphaBlendEnable = false;
CullMode = None;
PixelShader = TexturedPS;
VertexShader = TexturedVS;
}
}
感谢您的帮助
【问题讨论】:
标签: c# directx hlsl toolkit sharpdx