Ich versuche zu verstehen Fragment Shader-Eingabeposition von Vertex-Shader. Erhält jedes Fragment seine Position vom Vertex-Shader?Verständnis der Fragment-Shader-Eingabe aus dem Vertex-Shader
Hier ist meine shaders.metal
struct VertexOut{
float4 position [[position]];
float4 color;
};
vertex VertexOut basic_vertex(
const device packed_float3* vertex_array [[ buffer(0) ]],
unsigned int vid [[ vertex_id ]]) {
VertexOut vertexOut;
vertexOut.position = float4(vertex_array[vid], 1.0);
vertexOut.color = (vertexOut.position+1)/2;
return vertexOut;
}
Farbe
fragment float4 basic_fragment(VertexOut vertexOut [[stage_in]]) {
return vertexOut.color;
}
Farbe berechnet in Fragment-Shader in Vertex-Shader berechnet
fragment float4 basic_fragment(VertexOut vertexOut [[stage_in]]) {
return (vertexOut.position+1)/2;
}
warum sind sie anders gemacht? Welchen Wert hat die Vertexposition an jedes Fragment? Es scheint, dass alle Fragmente eines Dreiecks den Schwerpunkt des Dreiecks erhalten. Wie berechnet man die Position jedes Fragments im Fragmentpuffer?
--EDIT--
Teilungsposition mit in Fragment-Shader-Fenstergröße; immer noch ist das Dreieck gelb.
ViewController.swift
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let window = view.window
if(window == nil) {return}
let scale = view.window?.screen.nativeScale
let layerSize = view.bounds.size
//[640, 1136]
frameSize = [UInt(layerSize.width * scale!), UInt(layerSize.height * scale!)]
uniformBuffer = device.makeBuffer(bytes: frameSize, length: 2*MemoryLayout<UInt>.size, options: [])
}
func render() {
...
renderEncoder.setFragmentBuffer(uniformBuffer, offset: 0, index: 0)
...
}
shaders.metal
struct FrameSize{
unsigned int x;
unsigned int y;
};
fragment float4 basic_fragment(VertexOut vertexOut [[stage_in]],
const device FrameSize* frameSize [[ buffer(0) ]]
) { // 1
return float4(vertexOut.position.x/frameSize->x, vertexOut.position.y/frameSize->y, vertexOut.position.z, 1.0); // 2
}
Es hat nicht funktioniert. die Frage mit Vorschlägen bearbeitet – neckTwi