Metal / Swift-顶点缓冲区的第一个元素有一个错误的值

问题描述 投票:0回答:1

[我只是试图使用金属渲染红色正方形,并且我从一系列看起来像这样的顶点结构中创建顶点缓冲区:

struct Vertex {
    var position: SIMD3<Float>
    var color: SIMD4<Float>
}

这是我渲染正方形的地方:

var vertices: [Vertex] = [
    Vertex(position: [-0.5, -0.5, 0], color: [1, 0, 0, 1]),
    Vertex(position: [-0.5, 0.5, 0], color: [1, 0, 0, 1]),
    Vertex(position: [0.5, -0.5, 0], color: [1, 0, 0, 1]),
    Vertex(position: [0.5, 0.5, 0], color: [1, 0, 0, 1])
]

var vertexBuffer: MTLBuffer?

func render(using renderCommandEncoder: MTLRenderCommandEncoder) {
    if self.vertexBuffer == nil {
        self.vertexBuffer = self.device.makeBuffer(
            bytes: self.vertices,
            length: MemoryLayout<Vertex>.stride * self.vertices.count,
            options: []
        )
    }

    if let vertexBuffer = self.vertexBuffer {
        renderCommandEncoder.setRenderPipelineState(RenderPipelineStates.defaultState)
        renderCommandEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0)
        renderCommandEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: vertexBuffer.length / MemoryLayout<Vertex>.stride)
    }
}

这是我的渲染管道状态如下:

let library = device.makeDefaultLibrary()!
let vertexShader = library.makeFunction(name: "basicVertexShader")
let fragmentShader = library.makeFunction(name: "basicFragmentShader")

let renderPipelineDescriptor = MTLRenderPipelineDescriptor()
renderPipelineDescriptor.colorAttachments[0].pixelFormat = .bgra8Unorm
renderPipelineDescriptor.vertexFunction = vertexShader
renderPipelineDescriptor.fragmentFunction = fragmentShader
renderPipelineDescriptor.sampleCount = 4

let vertexDescriptor = MTLVertexDescriptor()

vertexDescriptor.attributes[0].format = .float3
vertexDescriptor.attributes[0].bufferIndex = 0 // Position
vertexDescriptor.attributes[0].offset = 0

vertexDescriptor.attributes[1].format = .float4
vertexDescriptor.attributes[1].bufferIndex = 0 // Color
vertexDescriptor.attributes[1].offset = MemoryLayout<SIMD3<Float>>.stride

vertexDescriptor.layouts[0].stride = MemoryLayout<Vertex>.stride
renderPipelineDescriptor.vertexDescriptor = vertexDescriptor

self.defaultState = try! device.makeRenderPipelineState(descriptor: renderPipelineDescriptor)

顶点和片段着色器仅通过位置和颜色。出于某种原因,在渲染时,第一个顶点的颜色的第一个浮点会以极小的值进入顶点着色器,从而有效地显示黑色。仅在数组中第一个顶点的红色值处发生。

带有一个黑色顶点的红色正方形

enter image description here

从调试GPU框架中可以看到,第一个顶点的红色分量为5E-41(基本上为0)。enter image description here

我不知道为什么会这样,将顶点添加到顶点缓冲区时会发生。我猜想这与我的渲染管道顶点描述符有关,但是我一直无法弄清楚出了什么问题。感谢您的帮助!

swift metal
1个回答
0
投票

[很有可能是this question的副本。我鼓励您考虑那里的解决方法,并提出您自己的反馈意见,以提高对此漏洞的可见性。 -warrenm

© www.soinside.com 2019 - 2024. All rights reserved.