簡體   English   中英

為什么在iOS Metal中旋轉此棱鏡無法正確渲染?

[英]Why is rotating this prism in iOS Metal not rendering correctly?

我已經建立了一個測試項目,用於在iOS上學習Metal來做一些渲染,但是我對如何使棱鏡繞y軸正確旋轉感到有點困惑。

這是在沒有深度測試的情況下渲染的棱鏡,因此可以看到所有方面,所以看起來這部分至少是正確的:

在此輸入圖像描述

這些是頂點:

static const float vertexData[] = {
     0.f,  1.f,  0.5f,
     1.f, -1.f,  0.f,
    -1.f, -1.f,  0.f,

     0.f,  1.f,  0.5f,
     1.f, -1.f,  1.f,
     1.f, -1.f,  0.f,

     0.f,  1.f,  0.5f,
    -1.f, -1.f,  1.f,
     1.f, -1.f,  1.f,

     0.f,  1.f,  0.5f,
    -1.f, -1.f,  0.f,
    -1.f, -1.f,  1.f
};

但是,當我打開旋轉時,會發生以下情況: https//www.dropbox.com/s/esg41j3ibncofox/prism_rotate.mov?dl = 0

(該視頻已打開深度測試)。 為什么棱鏡剪裁那樣(和/或它是什么剪裁)? 它並沒有圍繞它的中心旋轉。

以下是MVP矩陣的計算方法:

static simd::float3 viewEye = {0.f, 0.f, -2.f};
static simd::float3 viewCenter = {0.f, 0.f, 1.f};
static simd::float3 viewUp = {0.f, 1.f, 0.f};
static float fov = 45.f;

CGSize size = self.view.bounds.size;
Uniforms *uniforms = (Uniforms *)[uniformBuffer contents];
uniforms->view = AAPL::lookAt(viewEye, viewCenter, viewUp);
uniforms->projection = AAPL::perspective_fov(fov, size.width, size.height, 0.1f, 100.f);

uniforms->model = AAPL::translate(0.f, 0.f, 12.f) * AAPL::rotate(tAngle, 0.f, 1.f, 0.f);
tAngle += 0.5f;

transformlookAtrotateperspective_fov函數直接從我用作參考的Apple示例代碼中提取。

這是着色器:

typedef struct {
    float4 pos [[ position ]];
    half4 color;
    float mod;
} VertexOut;

vertex VertexOut basic_vertex(const device packed_float3* vertex_array [[ buffer(0) ]],
                              const device packed_float3* colors [[ buffer(1) ]],
                              constant Uniforms& uniform [[ buffer(2) ]],
                              uint vid [[ vertex_id ]],
                              uint iid [[ instance_id ]])
{
    float4 v = float4(vertex_array[vid], 1.f);
    float4x4 mvp_matrix = uniform.projection * uniform.view * uniform.model;

    VertexOut out;
    out.pos = v * mvp_matrix;
    uint colorIndex = vid / 3;
    out.color = half4(half3(colors[colorIndex]), 1.f);
    return out;
}

fragment half4 basic_fragment(VertexOut f [[ stage_in ]]) {
    return f.color;
}

任何幫助/提示將不勝感激。

嘆息..問題在於MVP矩陣的乘法順序與着色器中的頂點。

所以這:

out.pos = v * mvp_matrix;

應該:

out.pos = mvp_matrix * v;

無論出於何種原因,我習慣於向量行而不是列向量,並且我自己確信我對剪輯區域和/或矩陣本身有些誤解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM