Я пробовал различные способы интерполяции и создания изображения с правильной перспективой, но ни один из предложенных способов не работает.
Мой текущий код:
struct VertexStruct
{
float4 normalizedPosition [[ position ]];
float4 texCoord;
}
vertex VertexStruct testVertex(device float4 *vertices [[ buffer(0) ]],
uint vid [[ vertex_id ]])
{
VertexStruct outVertices;
outVertices.normalizedPosition = ...;
outVertices.texCoord = float4(vertices[vid].x, vertices[vid].y, 0.0, 127.0);
return outVertices;
}
fragment half4 testFragment(VertexStruct inFrag [[ stage_in ]],
texture2d<half, access::sample> volume [[ texture(0) ]])
{
float2 texCoord = float2(inFrag.texCoord.xy * (1.0 / inFrag.texCoord.w));
constexpr sampler s(coord::normalized, filter::linear, address::clamp_to_zero);
return volume.sample(s, texCoord);
}
Текстура 128x128 и вершины:
- 0,0
- 0,127
- 127,0
- 127,127
Теоретически 4-й параметр, w
, должен помочь с правильной интерполяцией перспективы. Сообщается, что этот трюк работает в OpenGL ES, но в моем случае, есть он у меня или нет, ничего не меняется.
Что я получаю:
Синий — это чистый цвет, а все, что находится внутри черной трапеции, — это содержимое текстуры. Красная трапеция должна находиться в центре черной трапеции. Если вы откроете его в Photoshop и проведете диагональ черной трапеции, она точно пройдет диагональ красной трапеции.
Это означает, что два треугольника, которые визуализируются, не считывают текстуру с правильным сэмплированием перспективы. Это классическая проблема наложения текстур, но я не могу с ней справиться.
Кто-нибудь может увидеть ошибку?