loki5100 7 Posted December 11, 2018 As far as I Know, YUV texture is a composition of 2 textures (the Y and the UV). Those 2 textures must be drawn on the canvas using a shader like this one : #version 100 precision mediump float; varying vec2 vUV; uniform sampler2D SamplerY; uniform sampler2D SamplerUV; void main() { mediump vec3 yuv; lowp vec3 rgb; yuv.x = texture2D(SamplerY, vUV).r; yuv.yz = texture2D(SamplerUV, vUV).rg - vec2(0.5, 0.5); // Using BT.709 which is the standard for HDTV rgb = mat3( 1, 1, 1, 0, -.18732, 1.8556, 1.57481, -.46813, 0) * yuv; gl_FragColor = vec4(rgb, 1); } I know how to use a shader with one texture (for example overridden TFilterBaseFilter), however, I don't know how I can use a shader with 2 textures in parameters (finality is to draw my YUV texture on a canvas) Share this post Link to post
Dalija Prasnikar 1404 Posted December 11, 2018 Maybe this can help https://stackoverflow.com/questions/41469082/open-gl-shader-with-2-textures Share this post Link to post
loki5100 7 Posted December 11, 2018 Thanks, Dalija, however, I m not sure I can use this to draw my YUV frame to a Canvas 😞 In Delphi, we have this, but I didn't find a way to make it work 😞 procedure TCustomContextOpenGL.DoSetShaderVariable(const Name: string; const Texture: TTexture); var Variable: TContextShaderVariable; begin if Valid then begin if FCurrentProgram <> nil then begin if FCurrentProgram.Variables.TryGetValue(Name, Variable) then begin glActiveTexture(GL_TEXTURE0 + Variable.TextureUnit); if Texture = nil then glBindTexture(GL_TEXTURE_2D, 0) else glBindTexture(GL_TEXTURE_2D, Texture.Handle); glUniform1i(Variable.Index, Variable.TextureUnit); glActiveTexture(GL_TEXTURE0); end; end; if GLHasAnyErrors then RaiseContextExceptionFmt(@SCannotFindShaderVariable, [Name]); end; end; Share this post Link to post
pcplayer99 11 Posted December 13, 2018 It is a very good topic. 1. how to draw YUV on FireMonkey; 2. how to draw YUV on FireMonkey 3D control surface. Share this post Link to post