Ich zeichne 2 verschiedene Vertex Puffer in Metall, eines mit einer Textur (Ignorieren Vertex Farbdaten) und das andere ohne eine Textur (Zeichnung nur die Eckpunktfarbe Daten):Texturen und keine Texturen zur gleichen Zeit in Metall, mit Multiplizieren
let commandBuffer = self.commandQueue.makeCommandBuffer()
let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: rpd)
//render first buffer with texture
commandEncoder.setRenderPipelineState(self.rps)
commandEncoder.setVertexBuffer(self.vertexBuffer1, offset: 0, at: 0)
commandEncoder.setVertexBuffer(self.uniformBuffer, offset: 0, at: 1)
commandEncoder.setFragmentTexture(self.texture, at: 0)
commandEncoder.setFragmentSamplerState(self.samplerState, at: 0)
commandEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: count1, instanceCount: 1)
//render second buffer without texture
commandEncoder.setRenderPipelineState(self.rps)
commandEncoder.setVertexBuffer(self.vertexBuffer2, offset: 0, at: 0)
commandEncoder.setVertexBuffer(self.uniformBuffer, offset: 0, at: 1)
commandEncoder.setFragmentTexture(nil, at: 0)
commandEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: count2, instanceCount: 1)
commandEncoder.endEncoding()
commandBuffer.present(drawable)
commandBuffer.commit()
der Shader sehen aus wie:
#include <metal_stdlib>
using namespace metal;
struct Vertex {
float4 position [[position]];
float4 color;
float4 texCoord;
};
struct Uniforms {
float4x4 modelMatrix;
};
vertex Vertex vertex_func(constant Vertex *vertices [[buffer(0)]],
constant Uniforms &uniforms [[buffer(1)]],
uint vid [[vertex_id]])
{
float4x4 matrix = uniforms.modelMatrix;
Vertex in = vertices[vid];
Vertex out;
out.position = matrix * float4(in.position);
out.color = in.color;
out.texCoord = in.texCoord;
return out;
}
fragment float4 fragment_func(Vertex vert [[stage_in]],
texture2d<float> tex2D [[ texture(0) ]],
sampler sampler2D [[ sampler(0) ]]) {
if (vert.color[0] == 0 && vert.color[1] == 0 && vert.color[2] == 0) {
//texture color
return tex2D.sample(sampler2D, float2(vert.texCoord[0],vert.texCoord[1]));
}
else {
//color color
return vert.color;
}
}
Ist das es ein besserer Weg, dies zu tun? Irgendein Vertex, den ich die Textur verwenden möchte, die ich auf Schwarz einstelle, und der Shader prüft, um zu sehen, wenn die Farbe schwarz ist, und wenn so, dann benutze die Textur, andernfalls benutze die Farbe.
Gibt es auch eine Möglichkeit, die farbigen Polys und strukturierten Polys mit einer Multiplikationsfunktion zu mischen, wenn sie sich auf dem Bildschirm überlappen? Es scheint, als hätte MTLBlendOperation nur Optionen für add/subtract/min/max, keine Multiplikation?
Ich bin neu in Metall und wurden harte Zeit, wie die Nutzung verwenden mehr als eine Textur auf ein Vertex Array diese Frage wird mir helfen, es zu tun, denke ich. – Hope