2017-07-30 6 views
0

Ich schreibe einen Metall-Shader.Metallfragment Shader, Zugriff aktuellen Framebuffer Farbe

Alles, was ich will, ist der Zugriff auf die aktuelle Farbe des Fragments.

Zum Beispiel.

Am Ende meiner Fragment-Shader, wenn ich lege return current + 0,1, zum Beispiel

Das Ergebnisbild von Schwarz auf FPS auf weiß gehen wird. Dies ist ein Basisprogramm, das einen dreieckigen Streifen zeichnet, der den Bildschirm ausfüllt. Ultimatives Ziel ist das Schreiben eines Pfad-Tracers innerhalb des Shaders, ich habe dies mit opengl + glsl gemacht. Ich habe Probleme mit den Puffern. Ich dachte, eine einfache Lösung wäre, einfach die aktuelle Ausgabefarbe zurück zum Shader zu leiten und sie dort zu mitteln.

Dies sind die Shadern:

#include <metal_stdlib> 
using namespace metal; 
#import "AAPLShaderTypes.h" 

vertex float4 vertexShader(uint vertexID [[vertex_id]], constant AAPLVertex *vertices [[buffer(AAPLVertexInputIndexVertices)]], constant vector_uint2 *viewportSizePointer [[buffer(AAPLVertexInputIndexViewportSize)]], constant vector_float4 * seeds) { 

    float4 clipSpacePosition = vector_float4(0.0, 0.0, 0.0, 1.0); 

    float2 pixelSpacePosition = vertices[vertexID].position.xy; 
    vector_float2 viewportSize = vector_float2(*viewportSizePointer); 
    clipSpacePosition.xy = pixelSpacePosition/(viewportSize/2.0); 

    return clipSpacePosition; 
} 

fragment float4 fragmentShader() 
{ 
    // I want to do this 
    // return currentColor + 0.1; 

    return float4(1.0, 1.0, 1.0, 1.0); 
} 

Antwort

0

Keine Sorge, war die Antwort mir ins Gesicht die ganze Zeit anstarrte.

Durchlauf in der aktuellen Farbe in die Fragment-Shader mit float4 color0 [[color (0)]]

mit diesen 2 Optionen renderPassDescriptor.colorAttachments [0] = .storeAction MTLStoreActionStore; renderPassDescriptor.colorAttachments [0] .loadAction = MTLLoadActionLoad;

Mein Problem war nicht die Farbe, es war in der Berechnung des Durchschnitts. In meinem Fall konnte ich keinen regelmäßigen Durchschnitt machen, da summieren sich alle bisherigen Farben und dividieren durch die Anzahl der Samples.

Was ich eigentlich tun musste, war einen gleitenden Durchschnitt zu berechnen.

https://en.wikipedia.org/wiki/Moving_average#Cumulative_moving_average