AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

YUV2 unter Firemonkey

Ein Thema von Peter666 · begonnen am 1. Dez 2017 · letzter Beitrag vom 4. Dez 2017
 
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#1

YUV2 unter Firemonkey

  Alt 1. Dez 2017, 13:10
Hi,

ich bekomme hier mittels Stream Rohdaten im YUY2 Format umwandelt. Da der Durchsatz relativ hoch ist, wollte ich die Darstellung mittels Pixelshader realisieren. Mein Ziel ist Android und iOS, unter Windows bzw. MacOS nutze ich für die Darstellung ein reines OpenGL Fenster. Dort mache ich das via:

Delphi-Quellcode:
vertexShaderString = 'attribute vec4 position;' + sLineBreak +
    'attribute vec2 texcoord;' + sLineBreak +
    'uniform mat4 modelViewProjectionMatrix;' + sLineBreak +
    'varying vec2 v_texcoord;' + sLineBreak + 'void main()' + sLineBreak + '{' +
    sLineBreak + ' gl_Position = modelViewProjectionMatrix * position;' +
    sLineBreak + ' v_texcoord = texcoord.xy;' + sLineBreak +
    ' gl_FrontColor = gl_Color;' + sLineBreak + '}';

  fragmentShaderString = 'varying vec2 v_texcoord;' + sLineBreak +
    'uniform sampler2D s_texture_y;' + sLineBreak +
    'uniform sampler2D s_texture_u;' + sLineBreak +
    'uniform sampler2D s_texture_v;' + sLineBreak + 'void main() ' + sLineBreak
    + '{' + sLineBreak + ' float y = texture2D(s_texture_y, v_texcoord).r;' +
    sLineBreak + ' float u = texture2D(s_texture_u, v_texcoord).r - 0.5;' +
    sLineBreak + ' float v = texture2D(s_texture_v, v_texcoord).r - 0.5;' +
    sLineBreak + ' float r = y + 1.402 * v;' + sLineBreak +
    ' float g = y - 0.344 * u - 0.714 * v;' + sLineBreak +
    ' float b = y + 1.772 * u;' + sLineBreak +
    ' gl_FragColor = vec4(r,g,b,1.0) * gl_Color;' + sLineBreak + '}';

...

    glUseProgram(FProgram);
    glUniformMatrix4fv(FuniformMatrix, 1, GLboolean(0), @FModelviewProj);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, Texture.Handle);

    glUniform1i(FUniformSamplers[0], 0);

    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, Texture.UHandle);
    glUniform1i(FUniformSamplers[1], 1);

    glActiveTexture(GL_TEXTURE2);
    glBindTexture(GL_TEXTURE_2D, Texture.VHandle);
    glUniform1i(FUniformSamplers[2], 2);
Ich habe schon versucht einen Filter zu schreiben, aber ich scheitere daran dass Firemonkey außer RGBA Bitmaps ja überhaupt nichts erlaubt. Jetzt den Code wild zu patchen widerstrebt mir, denn das bei jedem Update machen zu müssen. Da wird man doch blöde.

Hat jemand vielleicht eine Idee?
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz