【发布时间】:2020-05-09 18:20:22
【问题描述】:
我的问题是因为四边形只是两个三角形。纹理在每个三角形上的渲染不一致,并且纹理在两个三角形之间的边界处被破坏。我使用我可爱的 Minecraft 房子的屏幕截图作为示例纹理:
如你所见,从截图的左上角和右下角看,它似乎被剪掉了或折叠了之类的。它只是扭曲了。我所说的失真并不是因为它被应用于梯形,而是它被不一致地应用于构成梯形的两个三角形。
那么我该如何解决这个问题?
在 viewDidLoad 中:
let VertexDescriptor = MTLVertexDescriptor()
let Attribute1Offset = MemoryLayout<simd_float3>.stride
let Attribute2Offset = Attribute1Offset+MemoryLayout<simd_float4>.stride
VertexDescriptor.attributes[0].format = .float3
VertexDescriptor.attributes[1].format = .float4
VertexDescriptor.attributes[1].offset = Attribute1Offset
VertexDescriptor.attributes[2].format = .float2
VertexDescriptor.attributes[2].offset = Attribute2Offset
VertexDescriptor.layouts[0].stride = Attribute2Offset+MemoryLayout<simd_float2>.stride
PipelineDescriptor.vertexDescriptor = VertexDescriptor
let TextureLoader = MTKTextureLoader(device: Device)
Texture = try? TextureLoader.newTexture(URL: Bundle.main.url(forResource: "Texture.png", withExtension: nil)!)
顶点:
//First four = position, second four = color, last two = texture coordinates
let Vertices: [Float] = [-0.5, 0.5, 0, 0, 1, 1, 0, 1, 0, 0,
0.5, 0.5, 0, 0, 0, 1, 1, 1, 1, 0,
1, -1, 0, 0, 0, 1, 0, 1, 1, 1,
-1, -1, 0, 0, 0, 0, 1, 1, 0, 1]
输入Shaders.metal
typedef struct {
float4 Position [[attribute(0)]];
float4 Color [[attribute(1)]];
float2 TexCoord [[attribute(2)]];
} VertexIn;
typedef struct {
float4 Position [[position]];
float4 Color;
float2 TexCoord;
} VertexOut;
请耐心等待,我使用 PascalCase 是因为我认为 camelCase 很难看。我只是不喜欢它。无论如何,我如何正确地将纹理放置在由两个三角形组成的四边形中,这样它就不会看起来很奇怪?
【问题讨论】:
-
您需要展示您的顶点和片段着色器,以便我们为您提供建议。
标签: macos rendering textures metal