我在Android编程中使用OpenGL ES,当我在着色器中将YUV(NV21)转换为RGB时,如下所示:
vec3 yuv = vec3(
(texture2D(u_TextureY, vTextureCoord).r - 0.0625),
texture2D(u_TextureUV, vTextureCoord).a - 0.5,
texture2D(u_TextureUV, vTextureCoord).r - 0.5
);然后我会得到从u_TextureY和u_TextureUV中分离出来的YUV数据。
我知道NV21格式是这样的: YYYYYY...UVUV...但是如何将YUYV422转换为RGB呢?那么,我的问题是,在texture2D(u_TextureY, vTextureCoord).r和.a中,"r“和"a”是什么意思?然后我就可以找到做YUYV422->RGB的方法了。
发布于 2017-12-06 18:38:18
texture2D的返回类型为vec4。在GLSL中,可以单独访问向量的组件:
请参阅The OpenGL Shading Language specification
5.5矢量和标量分量和长度矢量或标量分量的名称由单个字母表示。为了方便起见,基于位置、颜色或纹理坐标向量的常见用法,将几个字母与每个组件相关联。可以通过在变量名称后面加上句点(.)选择各个组件。)然后是组件名称。支持的组件名称包括:
{x, y, z, w}在访问表示点的矢量时很有用,或者normals{r, g, b, a}在访问表示colors{s, t, p, q}的矢量时很有用当访问表示纹理坐标的矢量时很有用
组件的顺序可以是不同的,以对其进行混合或复制:
vec4 pos = vec4(1.0,2.0,3.0,4.0);vec4 swiz= pos.wzyx;// swiz = (4.0,3.0,2.0,1.0) vec4 dup = pos.xxyy;// dup = (1.0,1.0,2.0,2.0) vec4 f= 1.2;vec4 dup = f.xxxx;// dup = (1.2,1.2,1.2,1.2)
这意味着,.r给出了vec4的第一个分量,.a给出了vec4的第四个分量。
发布于 2017-12-07 10:40:13
好了,我已经解决了。来自@Rabbit76的答案很好,所以我们知道.r和.a来自{r,g,b,a}。我的问题不仅仅是什么是.r.a,还有为什么是.r.a。
我从这个答案enter link description here开始解决了这个问题
glTexImage2D(GL20.GL_TEXTURE_2D, 0, GL20.GL_LUMINANCE,
width, height, 0, GL20.GL_LUMINANCE, GL20.GL_UNSIGNED_BYTE, buffer_y);通过设置GL_LUMINANCE,OpenGL将此字节放入纹理的R、G和B分量中。因此,我们可以使用.r来获取Y值,也可以使用.g或.b。
glTexImage2D(GL20.GL_TEXTURE_2D, 0, GL20.GL_LUMINANCE_ALPHA,
width/2, height/2, 0, GL20.GL_LUMINANCE_ALPHA, GL20.GL_UNSIGNED_BYTE,
buffer_uv);通过设置GL_LUMINANCE_ALPHA,OpenGL将第一个字节“V”放入r/g/b组件,并将第二个字节“U”放入组件。所以我们可以用.a得到U,用.r得到V(.g或.b都可以)。
正如我们所知,NV21格式类似于YYYY...UVUV...似乎“U”是UV纹理中的第一个字节。
buffer_uv = ByteBuffer.allocateDirect(width * height * 4)
.order(ByteOrder.nativeOrder());buffer_uv与ByteOrder.nativeOrder()一起排序,检索底层平台的本机字节顺序。来自enter link description here,这意味着UV值(...UVUV...)按本机字节顺序从本机缓冲区读取,如...VUVU...,则相反。
https://stackoverflow.com/questions/47671934
复制相似问题