gpt4 book ai didi

ios - 动态更改 Metal 中顶点颜色的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-28 05:29:18 29 4
gpt4 key购买 nike

我正在尝试进入 Metal。我已经做了一些 OpenGL,但是已经好几年了,所以我想不出正确的方法来做到这一点。我一直在使用 Ray Wenderlich ( http://www.raywenderlich.com/81399/ios-8-metal-tutorial-swift-moving-to-3d ) 上的 Metal 教程介绍

我有一个顶点结构:

struct Vertex
{
var x, y, z: Float
var r, g, b, a: Float

func floatBuffer() -> Array<Float>
{
return [x, y, z, r, g, b, a]
}
}

和一个顶点缓冲类:

class VertexBuffer
{
var vertexData = Array<Float>()

init(vertices: Array<Vertex>)
{
var vertexData = Array<Float>()

for vertex in vertices
{
vertexData += vertex.floatBuffer()
}

self.vertexData = vertexData
}

func updateColorOfVertexAtIndex(index: Int, newRed: CGFloat, newGreen: CGFloat, newBlue: CGFloat, newAlpha: CGFloat)
{
let vertexDataIndex = index * 7

if (vertexDataIndex < self.vertexData.count)
{
self.vertexData[vertexDataIndex + 3] = Float(newRed)
self.vertexData[vertexDataIndex + 4] = Float(newGreen)
self.vertexData[vertexDataIndex + 5] = Float(newBlue)
self.vertexData[vertexDataIndex + 6] = Float(newAlpha)
}
}

func updateColorOfVertexAtIndex(index: Int, newColor: UIColor)
{
var red: CGFloat = 0.0
var green: CGFloat = 0.0
var blue: CGFloat = 0.0
var alpha: CGFloat = 0.0

newColor.getRed(&red, green: &green, blue: &blue, alpha: &alpha)

self.updateColorOfVertexAtIndex(index, newRed: red, newGreen: green, newBlue: blue, newAlpha: alpha)
}
}

基于一些其他应用程序的状态,我想更新一个或多个顶点的 RGBA。使用 VertexBuffer.updateColor... 方法,我正在更新 VertexBuffer.vertexData 中相应的 RGBA 值。我有一个连接到以下功能的 CADisplayLink:

func diffusionLoop()
{
self.updateVertexData()

var vertexData = self.inkVertexBuffer.vertexData

let dataSize = vertexData.count * sizeofValue(vertexData[0])
let vertexBuffer = self.device.newBufferWithBytes(vertexData, length: dataSize, options: nil)


autoreleasepool { () -> () in
self.renderColorsWithVertexBuffer(vertexBuffer)
}
}

func renderColorsWithVertexBuffer(vertexBuffer: MTLBuffer)
{
let renderPassDescriptor = MTLRenderPassDescriptor()
let drawable = self.metalLayer.nextDrawable()

renderPassDescriptor.colorAttachments[0].texture = drawable.texture
renderPassDescriptor.colorAttachments[0].loadAction = .Clear
renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(1.0, 1.0, 1.0, 0.0)
renderPassDescriptor.colorAttachments[0].storeAction = .Store

let commandBuffer = self.commandQueue.commandBuffer()

if let renderEncoder = commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor) {
renderEncoder.setRenderPipelineState(self.pipelineState)
renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, atIndex: 0)
renderEncoder.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: self.vertexCount, instanceCount: self.triangleCount)
renderEncoder.endEncoding()
}

commandBuffer.presentDrawable(drawable)
commandBuffer.commit()
}

问题是,我不知道这样做是否正确。我的目标是经常更新某些顶点的颜色,但是每次修改顶点数据并从中创建一个 MTLBuffer 是答案吗?还是别的?

任何帮助将不胜感激!

最佳答案

理想情况下,您不希望更新 vertexBuffer 的值。在我看来,最好的方法就是将不可变数据与可变数据分开。

所以我会创建单独的具有颜色值的统一缓冲区并更新它而不是 vertexBuffer 本身。

你还说“基于我想更新一个或多个顶点的 RGBA 的一些其他应用程序的状态......”,这可能会更好将这些“状态”作为常量传递给着色器并在着色器内部计算每个顶点或片段的颜色。

顶点着色器有:

unsigned int vid [[ vertex_id ]]

您可以使用它为每个顶点显式设置颜色。

关于ios - 动态更改 Metal 中顶点颜色的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29553923/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com