【问题标题】:Luminance 'y' value of surface texture表面纹理的亮度 'y' 值
【发布时间】:2025-12-03 13:50:01
【问题描述】:

对于我的 opengl 视频播放器应用,我使用绑定到 GL_TEXTURE_EXTERNAL_OES 的表面纹理

来源:https://github.com/crossle/MediaPlayerSurface/blob/master/src/me/crossle/demo/surfacetexture/VideoSurfaceView.java

在我的片段着色器中,我希望为 3x3 块获取亮度值。

vec2 tex00 = vec2(vTextureCoord.x-xmargin, vTextureCoord.y-ymargin)
vec4 p00 = texture2D(sTexture, tex00)

... etc for 3x3

然后计算每个纹素的亮度:即:p00 通过使用 (0.3,0.59,0.11) 的 vec3 做 p00.rgb 的点。

是否可以直接使用 p00.y ?会给出亮度值吗?

【问题讨论】:

    标签: opengl-es textures fragment-shader luminance


    【解决方案1】:

    不,p00.yp00.g(或 p00.t)相同。它们是访问向量的第二个组件(绿色通道)的不同方式。您可以以 XYZW、RGBA 或 STPQ 的形式访问组件,它们之间没有区别。

    人们使用.rgb 而不是.xyz 的唯一原因是让人们更容易阅读。

    【讨论】:

    • 哦,太好了。如果这真的是他所要求的,那就太好了!我从没想过可以暗示 y==luma。
    【解决方案2】:

    不,但对于您的用例来说可能足够接近。只使用 y 你会错过一些情况。纯红色图像为 0。不过,您可以将所有 9 个样本相加,然后对结果进行一个点积。

    【讨论】: