Ci-dessous se trouve un simple combo de vertex et fragment shader dans metal
qui rend 64 quads 2D identiques.Des performances inattendues ont été atteintes dans le métal en changeant les coordonnées uv
vertex VertexOut vertexMain(uint k [[ vertex_id ]],
uint ii [[instance_id]],
device float2* tex [[buffer(2)]],
device float2* position [[buffer(1)]],
device float* state [[buffer(0)]]){
VertexOut output;
int i = 4*ii+1;
float2 pos = position[k];
pos *= float2(state[i+2],state[i+3]);
pos += float2(state[i],state[i+1]);
pos.x *= state[0];
output.position = float4(pos,0,1);
output.tex = tex[k]*float2(du,dv);
return output;
};
fragment float4 fragmentMain(VertexOut input [[stage_in]],
texture2d<float> texture [[texture(0)]],
sampler sam [[sampler(0)]]){
return texture.sample(sam, input.tex);
};
L'échantillonneur est l'utilisation de coordonnées normalisées de sorte du
et dv
peut varier de 0 à 1 et de contrôler la taille d'un clip de la texture sera échantillonné en partant du coin inférieur gauche.
Il semble que j'ai un malentendu sur la façon dont l'échantillonnage fonctionne dans le métal. Je m'attendrais à ce que le coût de calcul reste constant quelles que soient les valeurs du
et dv
. Cependant, comme j'augmente du
et dv
à 1, la fréquence d'images diminue. Je n'utilise aucun mipmapping et je ne change pas la taille des quads qui sont pixellisés à l'écran. L'effet est plus spectaculaire avec le filtrage linéaire, mais se produit également avec le filtrage le plus proche. Il me semble que puisque le nombre de pixels dessinés à l'écran est le même, la charge sur le GPU ne doit pas dépendre de du
et dv
. Qu'est-ce que je rate?
EDIT: Voici mon sampler et l'attachement couleur:
let samplerDescriptor = MTLSamplerDescriptor()
samplerDescriptor.normalizedCoordinates = true
samplerDescriptor.minFilter = .linear
samplerDescriptor.magFilter = .linear
let sampler = device.makeSamplerState(descriptor: samplerDescriptor)
let attachment = pipelineStateDescriptor.colorAttachments[0]
attachment?.isBlendingEnabled = true
attachment?.sourceRGBBlendFactor = .one
attachment?.destinationRGBBlendFactor = .oneMinusSourceAlpha
Pouvez-vous quantifier la quantité de fréquence d'images que vous rencontrez? – warrenm
De 60 à 40 avec échantillonnage linéaire. De 60 à 50 avec échantillonnage le plus proche. – gloo
Sur quel périphérique et quelle version du système d'exploitation? – warrenm