我正在使用rastertek框架進行地形生成。我有從頂點着色器渲染的地形,但我不知道如何計算着色器中的法線。 Theres在其中一個類中生成函數調用,從地形生成法線,但只有在cpu上生成terrain時才起作用。繼承人的頂點着色器的代碼,我使用的是:頂點着色器中的正常計算?
////////////////////////////////////////////////////////////////////////////////
// Filename: terrain.vs
////////////////////////////////////////////////////////////////////////////////
#include "terrain.fx"
/////////////
// GLOBALS //
/////////////
cbuffer MatrixBuffer
{
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix;
};
//////////////
// TYPEDEFS //
//////////////
struct VertexInputType
{
float4 position : POSITION;
float3 normal : NORMAL;
};
struct PixelInputType
{
float4 position : SV_POSITION;
float3 normal : NORMAL;
};
////////////////////////////////////////////////////////////////////////////////
// Vertex Shader
////////////////////////////////////////////////////////////////////////////////
PixelInputType TerrainVertexShader(VertexInputType input)
{
PixelInputType output;
input.position.y = input.position.y + terrain(input.position.x,input.position.z);
// Change the position vector to be 4 units for proper matrix calculations.
input.position.w = 1.0f;
// Calculate the position of the vertex against the world, view, and projection matrices.
output.position = mul(input.position, worldMatrix);
output.position = mul(output.position, viewMatrix);
output.position = mul(output.position, projectionMatrix);
// Calculate the normal vector against the world matrix only.
output.normal = mul(input.normal, (float3x3)worldMatrix);
// Normalize the normal vector.
output.normal = normalize(output.normal);
return output;
}
爲什麼你想這樣做?每次頂點着色器調用時你想計算法線?我不認爲這是個好主意。爲什麼不能用cpu生成所有的法線? – acrilige 2013-04-06 21:08:03
@Acrilige:節省內存帶寬...如果你已經超過了你的內存預算,但擁有GPU的多餘能力,這些東西可能非常有用......同樣你也許不會超過你的內存預算,但是你可能會發現你可能會堵塞一個負載更多地進入你的shader withotu傷害表現。爲什麼不使用它? – Goz 2013-04-07 13:10:24
我會知道,謝謝你的解釋 – acrilige 2013-04-07 13:23:58