opengl: convert texture coords in fragment shader
A picture is stored in OpenGL textures (one per plane), possibly with
padding (the texture may be larger than the actual picture).
The conversion from picture coordinates to texture coordinates (which
takes the padding into account) was applied on the input coordinates,
before the vertex shader. As a consequence, the vertex shader received
one vector of input texture coordinates per plane (the padding is not
necessarily the same for all the planes):
(before this commit)
picture texture
coords coords (attributes) (varyings)
(1 per plane)
(x0, y0) --> MultiTexCoord0 TexCoord0 fragment
(x,y) --> (x1, y1) --> MultiTexCoord1 --> TexCoord1 --> shader
(x2, y2) --> MultiTexCoord2 TexCoord2
This poses a problem to separate chroma conversion from rendering: the
renderer should be able to retrieve a pixel color in picture
coordinates, regarless of the input format or padding.
To solve this issue, pass the picture coordinates instead of the texture
coordinates as attribute, and initialize uniform matrices to convert
from picture to texture coordinates for each plane directly in the
fragment shader:
(after this commit)
picture
coords (attribute) (varying)
(x,y) --> PicCoordsIn --> PicCoords --> fragment shader
^^^
|||
TexCoordsMap0 --'||
(uniforms) TexCoordsMap1 ---'|
TexCoordsMap2 ----'
Note that this also changes the multiplication order of
(non-commutative) matrices, from (semantically):
TexCoords = Orientation * TexCoordsMap * PicCoords
to:
TexCoords = TexCoordsMap * Orientation * PicCoords
The latter is the correct one: the orientation defines how the input
picture is rotated, so it must apply to picture coordinates, regardless
of the actual coordinates in the texture.
As a side effect, BuildRectangle, BuildSphere and BuildCube are now
independant of both the number of planes and any texture padding.
For now, TexCoordsMap is computed from the renderer, but the goal is to
move it to a separate component (a "sampler").
Signed-off-by:
Jean-Baptiste Kempf <jb@videolan.org>
Showing
- modules/video_output/opengl/fragment_shaders.c 19 additions, 17 deletionsmodules/video_output/opengl/fragment_shaders.c
- modules/video_output/opengl/renderer.c 142 additions, 144 deletionsmodules/video_output/opengl/renderer.c
- modules/video_output/opengl/renderer.h 6 additions, 2 deletionsmodules/video_output/opengl/renderer.h
Loading
Please register or sign in to comment