首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >texture2D().r和texture2D().a是什么意思?

texture2D().r和texture2D().a是什么意思?
EN

Stack Overflow用户
提问于 2017-12-06 18:22:22
回答 2查看 3.5K关注 0票数 5

我在Android编程中使用OpenGL ES,当我在着色器中将YUV(NV21)转换为RGB时,如下所示:

代码语言:javascript
复制
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_TextureYu_TextureUV中分离出来的YUV数据。

我知道NV21格式是这样的: YYYYYY...UVUV...但是如何将YUYV422转换为RGB呢?那么,我的问题是,在texture2D(u_TextureY, vTextureCoord).r和.a中,"r“和"a”是什么意思?然后我就可以找到做YUYV422->RGB的方法了。

EN

回答 2

Stack Overflow用户

发布于 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的第四个分量。

票数 5
EN

Stack Overflow用户

发布于 2017-12-07 10:40:13

好了,我已经解决了。来自@Rabbit76的答案很好,所以我们知道.r和.a来自{r,g,b,a}。我的问题不仅仅是什么是.r.a,还有为什么是.r.a。

我从这个答案enter link description here开始解决了这个问题

代码语言:javascript
复制
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。

代码语言:javascript
复制
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纹理中的第一个字节。

代码语言:javascript
复制
buffer_uv = ByteBuffer.allocateDirect(width * height * 4)
            .order(ByteOrder.nativeOrder());

buffer_uv与ByteOrder.nativeOrder()一起排序,检索底层平台的本机字节顺序。来自enter link description here,这意味着UV值(...UVUV...)按本机字节顺序从本机缓冲区读取,如...VUVU...,则相反。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47671934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档