Я использую растровые рамки для генерации ландшафта. У меня есть рельеф, полученный из вершинного шейдера, но я не знаю, как вычислить нормали в шейдере. Это вызов функции в одном из классов, который генерирует нормали из рельефа, но это работает только в том случае, если рельеф был сгенерирован на процессоре. Heres код для вершинного шейдера Я использую:Нормальные вычисления в вершинном шейдере?
////////////////////////////////////////////////////////////////////////////////
// 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;
}
Почему вы хотите это сделать? Вы хотите вычислить нормали каждый раз, когда вызывает вершинный шейдер? Я не думаю, что это хорошая идея. Почему вы не можете генерировать все нормали с процессором? – acrilige
@Acrilige: чтобы сэкономить пропускную способность памяти ... Если вы превысили свой бюджет памяти, но имеете запасную мощность GPU, такие вещи могут быть очень полезными ... в равной степени вы не можете превысить свой бюджет памяти, но вы можете обнаружить, что вы можете затормозить нагрузку больше в ваши шейдеры, не нанося вреда производительности. Почему бы не использовать это? – Goz
Я буду знать, спасибо за объяснение – acrilige